一、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)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  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.左旋转字符相关推荐

  1. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  2. 备战sp23春招 day8 | 344.反转字符串 541. 反转字符串II 剑指 05.替换空格 151.翻转字符串里的单词 剑指58-II.左旋转字符串

    344 反转字符串 class Solution {public:void reverseString(vector<char>& s) {int n = s.size();int ...

  3. 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

    LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...

  4. Suzy找到实习了吗Day 8 | 字符串开始啦 344. 反转字符串,541. 反转字符串 II,剑指 Offer 05. 替换空格,151. 反转字符串中的单词,左旋转字符串

    这里是目录 344. 反转字符串 题目 Solution 541. 反转字符串 II 题目 Solution(v1) Solution(v2) 剑指 Offer 05. 替换空格 做题记录 151. ...

  5. 力扣-图解算法数据结构-剑指 Offer 05. 替换空格

    题目要求 力扣题解 代码 /*** @program: mydemo* @description: 剑指 Offer 05. 替换空格* @author: Mr.zeng* @create: 2021 ...

  6. 剑指 Offer 05. 替换空格(完整代码)

    文章目录 剑指 Offer 05. 替换空格 1. 核心代码 2. 完整代码 总结 剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". ...

  7. 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词

    剑指 Offer 58 - II. 左旋转字符串 把前k个字符移动到结尾 翻转前k个字符,翻转剩余字符 翻转整个字符串 class Solution { public:void reverse(str ...

  8. 代码随想录算法训练营第八天|kmp算法

    kmp题目链接 讲解直接看代码随想录就可以了,代码随想录 一.什么是前缀表         前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配. 那么什么是前 ...

  9. 代码随想录算法训练营第八天

    找出字符串中第一个匹配项的下标 题目:LeetCode.28 写法一:暴力循环 class Solution {public int strStr(String haystack, String ne ...

最新文章

  1. 【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式(如:¥1,000,000,000.00)
  2. 在ubuntu下搭建Android的开发环境
  3. Javascript学习资源整理
  4. 可视化神经机器翻译模型(基于注意力机制的Seq2seq模型)
  5. Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
  6. 微信支付宝 支付单文件操作
  7. springboot 分页查询参数_10. Spring Boot 中的分页查询
  8. react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS
  9. 分阶段付款 学php,项目整理-支付宝的支付问题
  10. mcp证书有什么用_初级会计职称有什么用?考下证书可以做什么工作?
  11. 2004-7-21/22+ DataGrid知识整理
  12. visio mysql使用教程_visio2007使用方法
  13. linux sz 大于4g,ubuntu 使用sz命令传输windows大于4G的文件
  14. nginx启用reuseport
  15. html的div双线边框,设置div边框
  16. 【CISSP备考】第五章-身份与访问管理
  17. 平方度用计算机打出来,角度计算器-角度计算器
  18. C4D致富经典入门到精通(十)
  19. Can‘t use Subversion command line client:svn不能使用Subversion命令行客户端:svn
  20. NOIP 2002普及组 过河卒详解

热门文章

  1. 大学生个人简历模板范文精选5篇
  2. 浙江大学计算机考研机试KY132 xxx定律
  3. python 复制粘贴excel_关于python:对于excel粘贴到新单元格
  4. 对话框中显示jpg,bmp图片和对话框动态显示图片
  5. 思维实验:相对论演绎思考(1)
  6. UGNX编程模板和常用刀具库制作
  7. 数据改版 | CnOpenData中国高新技术企业专利统计数据
  8. unity3d 5.6烘焙教程 持续更新中
  9. Word从任意页设置页码
  10. QT 在子窗口中调用主窗口的UI