代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符
一、344.反转字符串
力扣
思路:很简单的一个for循环双指针,left和right交换。
class Solution {public void reverseString(char[] s) {int left = 0;int right = s.length -1;for (; left < s.length / 2; left++,right--) {char temp = s[left];s[left] = s[right];s[right] = temp;}}
}
二、541. 反转字符串II
力扣
思路:在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。
所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
class Solution {public String reverseStr(String s, int k) {for (int i = 0; i < s.length(); i += 2*k) {// 1. 每隔 2k 个字符的前 k 个字符进行反转// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if (i + k <= s.length()) {s = reverse(s, i, i + k - 1);continue;}else {// 3. 剩余字符少于 k 个,则将剩余字符全部反转。s = reverse(s, i, s.length() - 1);}}return s;}private String reverse(String s, int start, int end) {char[] str = s.toCharArray();//System.out.println("str1=" + str.toString());for (int i = start, j = end; i < j; i++, j--) {char temp = str[i];str[i] = str[j];str[j] = temp;}return String.valueOf(str);}
}
三、剑指Offer 05.替换空格
力扣
思路1: 使用StringBuilder,遇到空格就把空格换成“%20”。
class Solution {public String replaceSpace(String s) {if (s == null) {return null;}StringBuilder sb = new StringBuilder();for (int i = 0; i < s.length(); i++) {if (s.charAt(i) != ' ') {sb.append(s.charAt(i));}else {sb.append("%20");}}return sb.toString();}
}
思路2:首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
tips:将字符数组变成字符串的方法:1.new String(chars) 2.String.valueOf(chars) .
class Solution {public String replaceSpace(String s) {if (s.length() == 0 || s == null) {return s;}StringBuilder str = new StringBuilder();for (int i = 0; i < s.length(); i++) {if(s.charAt(i) == ' '){str.append(" ");}}int left = s.length() - 1;//左指针:指向原始字符串最后一个位置s += str.toString();int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置char[] chars = s.toCharArray();while (left >= 0) {if (chars[left] == ' ') {chars[right--] = '0';chars[right--] = '2';chars[right] = '%';}else {chars[right] = chars[left];}left--;right--;}return String.valueOf(chars);}
}
四、151.翻转字符串里的单词
力扣
思路:
class Solution {/*** 不使用Java内置方法实现* 1.去除首尾以及中间多余空格* 2.反转整个字符串* 3.反转各个单词*/public String reverseWords(String s) {// 1.去除首尾以及中间多余空格StringBuilder sb = removeSpace(s);// 2.反转整个字符串reverseString(sb, 0, sb.length() - 1);// 3.反转各个单词reverseEachWord(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(c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}start++;}return sb;}/*** 反转字符串指定区间[start, end]的字符*/private 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--;}}/*** 反转各个单词*/private void reverseEachWord(StringBuilder sb) {int start = 0;int end = 1;//用来寻找单词的区间int n = sb.length();while (start < n) {while (end < n && sb.charAt(end) != ' ') {//空格前为一个完整单词end++;}reverseString(sb, start, end - 1);start = end + 1;end = start + 1;}}
}
五、剑指Offer58-II.左旋转字符串
力扣
思路1:使用额外的空间很容易写出来,StringBuilder。
思路2:不使用额外的空间,1.反转区间为前n的子串 2.反转区间为n到末尾的子串 3.反转整个字符串。
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();}private 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--;}}
}
六、总结
在这篇文章344.反转字符串 (opens new window),第一次讲到反转一个字符串应该怎么做,使用了双指针法。
然后发现541. 反转字符串II (opens new window),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
后来在151.翻转字符串里的单词 (opens new window)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。
最后再讲到本题,本题则是先局部反转再 整体反转,与151.翻转字符串里的单词 (opens new window)类似,但是也是一种新的思路。
代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符相关推荐
- 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...
- 备战sp23春招 day8 | 344.反转字符串 541. 反转字符串II 剑指 05.替换空格 151.翻转字符串里的单词 剑指58-II.左旋转字符串
344 反转字符串 class Solution {public:void reverseString(vector<char>& s) {int n = s.size();int ...
- 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...
- Suzy找到实习了吗Day 8 | 字符串开始啦 344. 反转字符串,541. 反转字符串 II,剑指 Offer 05. 替换空格,151. 反转字符串中的单词,左旋转字符串
这里是目录 344. 反转字符串 题目 Solution 541. 反转字符串 II 题目 Solution(v1) Solution(v2) 剑指 Offer 05. 替换空格 做题记录 151. ...
- 力扣-图解算法数据结构-剑指 Offer 05. 替换空格
题目要求 力扣题解 代码 /*** @program: mydemo* @description: 剑指 Offer 05. 替换空格* @author: Mr.zeng* @create: 2021 ...
- 剑指 Offer 05. 替换空格(完整代码)
文章目录 剑指 Offer 05. 替换空格 1. 核心代码 2. 完整代码 总结 剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". ...
- 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词
剑指 Offer 58 - II. 左旋转字符串 把前k个字符移动到结尾 翻转前k个字符,翻转剩余字符 翻转整个字符串 class Solution { public:void reverse(str ...
- 代码随想录算法训练营第八天|kmp算法
kmp题目链接 讲解直接看代码随想录就可以了,代码随想录 一.什么是前缀表 前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配. 那么什么是前 ...
- 代码随想录算法训练营第八天
找出字符串中第一个匹配项的下标 题目:LeetCode.28 写法一:暴力循环 class Solution {public int strStr(String haystack, String ne ...
最新文章
- 【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式(如:¥1,000,000,000.00)
- 在ubuntu下搭建Android的开发环境
- Javascript学习资源整理
- 可视化神经机器翻译模型(基于注意力机制的Seq2seq模型)
- Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
- 微信支付宝 支付单文件操作
- springboot 分页查询参数_10. Spring Boot 中的分页查询
- react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS
- 分阶段付款 学php,项目整理-支付宝的支付问题
- mcp证书有什么用_初级会计职称有什么用?考下证书可以做什么工作?
- 2004-7-21/22+ DataGrid知识整理
- visio mysql使用教程_visio2007使用方法
- linux sz 大于4g,ubuntu 使用sz命令传输windows大于4G的文件
- nginx启用reuseport
- html的div双线边框,设置div边框
- 【CISSP备考】第五章-身份与访问管理
- 平方度用计算机打出来,角度计算器-角度计算器
- C4D致富经典入门到精通(十)
- Can‘t use Subversion command line client:svn不能使用Subversion命令行客户端:svn
- NOIP 2002普及组 过河卒详解