【算法第六天7.19】反转字符串,反转字符串||,剑指 Offer 05. 替换空格,反转字符串的单词, 左旋转字符串

链接力扣344-反转字符串

链接力扣541-反转字符串||

链接剑指 Offer 05. 替换空格

链接力扣151- 反转字符串的单词

链接剑指 Offer 58 - II. 左旋转字符串

================================================

链接力扣344-反转字符串

思路:以中间为分界线,左右两个边界交换字符,依次向里收缩

class Solution {public void reverseString(char[] s) {int n = s.length;for(int i = 0, j = n-1; i<j; i++,j--){char tmp = s[i];s[i] = s[j];s[j] = tmp;}}
}

链接力扣541-反转字符串||

思路
首先:字符串转化为字符数组

char[] res = s.toCharArray();

最后:将数组再转回字符串

return new String(res);

1、循环以2k为单位,
2、在这个2k长的数组中进行反转,需要有首尾索引
3、start就是i,end在循环过程中为i+k-1,如果到数组最后且不够k个,直接将length-1作为尾

class Solution {public String reverseStr(String s, int k) {// 字符串转化为字符数组char[] res = s.toCharArray();// 这段的逻辑:// 1、循环以2k为单位,// 2、在这个2k长的数组中进行反转,需要有首尾索引// 3、start就是i,end在循环过程中为i+k-1,如果到数组最后且不够k个,直接将length-1作为尾for(int i = 0; i < res.length; i += 2*k){int start = i;int end = Math.min(start + k - 1, res.length-1);reverse(res,start,end);}return new String(res);}public char[] reverse(char[] ch,int i,int j){int n = ch.length;while(i < j){char tmp = ch[i];ch[i] = ch[j];ch[j] = tmp;i++;j--;}return ch;}
}

链接剑指 Offer 05. 替换空格

思路

循环过程中,都把字符串转为了字符数组,这样方便遍历

使用双指针方法,不使用额外空间
1、用StringBuider先把需要增加的空间给算出来
2、用两个指针:left指向旧字符串的末尾,right指向新字符串的末尾
一旦遇到旧字符的空位,新字符串需要加’0’,‘2’,'%'这三个字符;
如果没遇到空位,则直接让新串right=旧串left;
最后再进行left–;right–
3、特殊情况:s串为空或者长度为0;遍历之后,发现s串中没有空格(需要添加的)

class Solution {public String replaceSpace(String s) {// 如果s为空或者长度为0if(s == null || s.length() == 0) return s;char[] arr = s.toCharArray();StringBuilder str = new StringBuilder();for(int i = 0; i < arr.length; i++){if(arr[i] == ' '){str.append("  ");}}// 如果str为0,则说明原字符串无空格if(str.length() == 0) return s;int left = s.length()-1;//串的拼接s += str.toString();int right = s.length()-1;char[] ch = s.toCharArray();//循环条件:旧串一直到最前面一个while(left >= 0){if(ch[left] ==' '){ch[right--] = '0';ch[right--] = '2';ch[right] = '%';}else{ch[right] = ch[left];}left--;right--;}//最后,将字符数组直接放入String中return new String(ch);}
}

链接力扣151- 反转字符串的单词

思路
1、先处理单词中可能的多余空格
2、整个串全部反转
3、串中的单词逐个反转回来

class Solution {public String reverseWords(String s) {StringBuilder sb = removeSpace(s);reverseString(sb,0,sb.length()-1);reEachWord(sb);return sb.toString();}private StringBuilder removeSpace(String s){int start = 0;int end = s.length() - 1;//删除前后位置的空格while (s.charAt(start) == ' ') start++;while (s.charAt(end) == ' ') end--;StringBuilder sb = new StringBuilder();while(start <= end){char c = s.charAt(start);// 下面的循环可以保证每个单词间只有一个空格// if的第一个条件,保证空格前的单词可以进入sb中,// 当c == ' '时,第二个条件发挥作用// if的第二个条件,保证单词与单词间只有一个空格// 当c == ' '且sb.charAt(sb.length() - 1) == ' '时,则说明有多余的空格,start需要++if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){sb.append(c);}start++;}return sb;}/*** 反转字符串指定区间[start, end]的字符*/public void reverseString(StringBuilder sb, int start, int end) {// System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}// System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");}private void reEachWord(StringBuilder sb){int start = 0;int end = 1;int n = sb.length();// 第一个遍历:整个带空格的字符串的遍历while(start < n){// 第二个遍历:对每个单词进行遍历// 直到遍历到end为空结束while(end < n && sb.charAt(end) != ' '){end++;}// end - 1 是因为end现在指向的是空reverseString(sb,start,end-1);// end为空,+1是下一个单词的开始start = end + 1;end = start + 1;}}
}

链接剑指 Offer 58 - II. 左旋转字符串

思路

用substring的思路:将前n个存到sb串中,把前几个截走,再接上sb串
不用substring的思路:先反转前n个,再反转后面的,最后整体反转一次

使用substring()

class Solution {public String reverseLeftWords(String s, int n) {StringBuilder sb = new StringBuilder();for(int i = 0; i < n; i++){sb.append(s.charAt(i));}String newstr = s.substring(n);newstr += sb.toString();return newstr;}
}

三次反转代码

class Solution {public String reverseLeftWords(String s, int n) {int len=s.length();StringBuilder sb=new StringBuilder(s);reverseString(sb,0,n-1);reverseString(sb,n,len-1);return sb.reverse().toString();}public void reverseString(StringBuilder sb, int start, int end) {while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git clone 或者是vscode clone 时遇到the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed使用git clone总是报错 查看原因有三种可能&#xff1a;要么是缓存不够&#xff0c;要么是网络不行&#xff0c;要么墙的原因。 如果是网络不行&#xff0c;可以配置git的最低速度和最…

C#基础--线程之Task

C#基础–线程之Task Task 是.NetFramework3.0出现的,Task里面的线程是来自于线程池 一、Task 1. 开启一个线程 Task 构造函数 传入一个无参数的 Action 委托作为参数 Task task = new Task(() =>{this.DoSomethingLong("btntask_Click1");}); task.Start();Run…

局部响应归一化LRN(Local Response Normalization)

LRN&#xff08;Local Response Normalization&#xff09;是一种局部响应归一化的技术&#xff0c;在深度学习中常用于增强模型的泛化能力和对光照、对比度等变化的鲁棒性。LRN主要用于激活函数后的归一化过程&#xff0c;它对局部神经元响应进行归一化&#xff0c;使得响应较…

C/C++ 使用 define 实现运行时函数是在哪个文件哪个函数被调用

1. 原始代码 // demo2.h #include <iostream>void testFunc(int num) {std::cout << num << std::endl; }//main.cc #include "demo2.h"void func1() { }void func2() {testFunc(24); }int main() {func1();func2();return 0; }我现在需要知道 te…

re学习(19)[ACTF新生赛2020]easyre1(UPX脱壳)

文章链接&#xff1a;BUUCTF在线评测 参考视频&#xff1a;B站 【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 &#xff1f; - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 题解&#xff1a; 工具脱壳 key"*F\"N,\"…

MYSQL数据库-数据库的学习

MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数&#xff08;SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB 2、什么…

C#基础--进程和线程的认识

C#基础–进程和线程的认识 一、基础概念 1. 什么是进程? 进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运…

【矩阵的创建与基本运算】——matlab基础

目录索引 创建矩阵&#xff1a;zeros()&#xff1a;ones&#xff1a;eye()&#xff1a;magic()&#xff1a;引号创建序列矩阵&#xff1a;linspace()&#xff1a; 加减与数乘&#xff1a;其他运算&#xff1a;指数运算&#xff1a;*exp()&#xff1a;* 点式运算&#xff1a; 创…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡&#xff0c;选中允许远程连接&#xff0c;如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理&#xff0c; 1&#xff09;手动代理的主机名设为电脑ip&…

centos 7升级gcc到10.5.0

目录 1、安装gcc 1.1、查看是否含有gcc及gcc版本 1.2、快速安装gcc 2、升级gcc 2.1、下载gcc源码包并解压缩 2.2、下载编译依赖项 2.3、新建gcc-bulid目录&#xff08;与gcc-10.5.0同级&#xff09;并进入该目录中 2.4、生成Makefile文件 2.5、开始编译 2.6、安装 2…

北京小厂一面30问

小厂一面30问 Redis除了存储数据外还能实现什么功能&#xff1f; 除了存储数据外&#xff0c;Redis还可以实现数据的缓存、分布式锁、消息队列、计数器等功能。Redis还支持事务、Lua脚本、发布/订阅等高级功能。 HashMap的底层原理是什么&#xff1f; HashMap是通过数组和链表…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览&#xff1a; rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定&#xff1a; 分开的范围之间可用逗号隔开&#xff0c;最后再用一个小括号括起来。F4可以快速锁定行和列。…

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…

Linux resin自动启动设置

1、添加启动脚本 在 /etc/init.d 添加启动脚本 vi resin #!/bin/sh #chkconfig:345 99 10 #description:auto start resin #/etc/init.d/resin export export JAVA_HOME/usr/weaver/jdk1.8.0_151 export CLASSPATH$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib exp…

Promise

Promise 什么是Promise Promise是一种异步编程的解决方案&#xff0c;可以避免回调地狱&#xff0c;使得异步操作更加简单、清晰、灵活。 为什么使用Promise function request(cb) {// 模拟网络请求let flag Math.random() < 0.5 ? true : falsesetTimeout(() > {c…

利用脚本将代码部署到测试环境(.sh)

1.将上次的部署文件备份名为xxx_bak 2.首次需要输入环境密码 3.并生成一个zip的压缩包,方便部署到线上环境 4.在终端 输入./update.sh 则可执行 文件名update.sh,放在package.json文件同级 # example: 1. ./update.sh 2. 输入服务器密码 【 如果不想每次都输入密码可以先生…

《零基础入门学习Python》第046讲:魔法方法:描述符(Property的原理)

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 常言道&#xff1a;“无规矩不成方圆”&#xff0c;讲的是万事万物的发展都要在一定的规则下去运行&#xff0c;只有遵循一定的协议去做&#xff0c;事情才能够按照…

k8s1.18.20:cert-manager 1.8 安装部署

cert-manager 安装部署 一、官网安装文档 https://cert-manager.io/docs/installation/ 1.1、简介 cert-manager 在 Kubernetes 集群中增加了证书 (certificates) 和证书颁发者 (certificate issuers) 作为资源类型&#xff0c;并简化了获取、更新和应用这些证书的过程。 …

基于 Orbit 的云原生应用交付基础原则与良好实践

点击官网了解详情 本文作者&#xff1a;何文强——腾讯云 CODING 高级架构师。 负责 CODING DevOps产品解决方案架构设计和技术产品布道以及 CODING 云原生技术研究与落地实践。在多个技术大会担任演讲嘉宾&#xff0c;腾讯云 CODING DevOps 课程认证出品人&#xff0c;腾讯云云…

PWM呼吸灯+流水灯设计

完成任务&#xff1a; 在流水灯基础上加入pwm呼吸灯设计&#xff0c;关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 &#xff0c;开发板上灯每两秒进行一次切换&#xff0c;每一个的亮灭间隔为一秒。 代码参考&#xff1a; module pwm_led_change(input wire …