344.反转字符串
题目链接:力扣
思路
遍历,用临时指针保存,进行替换
反转字符串
class Solution { public void reverseString(char[] s) { for (int i = 0 ; i < s.length/2 ; i++) { char temp = s[i]; s[i] = s[s.length-1-i]; s[s.length-1-i] = temp; } } }
541. 反转字符串II
题目链接:力扣
思路
java中String类的对象是不可改变的,String类中每一个看起来会修改String值的方法,实际上都创建并返回了一个全新的String对象,所以String自身没有灵活的reverse()功能,StringBiuder倒是有,但是这个题目是每隔一段,部分进行反转,所以StringBiuder也不是很灵活
所以将String转换成字符数组进行操作,自定义reverse()方法
这里continue使用真的很绝,将满足一般情况的操作写在if判断中,即保证了每次有k个元素都可以处理,又保证了最后剩下的元素进行反转
反转字符串||
第一步:将String转换成字符数组(好操作)
第二步:遍历数组,每2k个元素改变 i ,把没2k个字符看成一个整体
第三步:如果 i + k <= ch.length ,那说明这个2k整体元素是满的,那就进行反转
第四步:题目中的两个条件(1、剩下的不够k个全反转 2、剩下的不过2k个反转前k个),其实第2种情况在第三步的步骤中已经包含了
class Solution { public String reverseStr(String s, int k) { // 将字符串转换成字符数组 char[] ch = s.toCharArray(); for (int i = 0; i < ch.length; i += 2*k) { // 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 // 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 if (i + k <= ch.length) { reverse(ch , i, i+k-1); continue; } // 如果剩余字符少于 k 个,则将剩余字符全部反转 reverse(ch , i , ch.length-1); } return new String(ch); } // 定义反转的函数 public void reverse(char[] ch , int i , int j) { for ( ; i < j ; i++,j--) { char tmep = ch[i]; ch[i] = ch[j]; ch[j] = tmep; } } }
剑指Offer 05.替换空格
题目链接:力扣
思路
一开始呢,考虑的是将字符串用空格分隔,然后再进行字符串的拼接,每拼接一个单词后就加上“%20”,但是有一种情况没通过,那就是一个字符串全都是空格,这种方法是不全面的
所以将每一个字符都拿出来,如果是空格就加成“%20”,这样就是把字符串转换成字符数组
最后发现,还是搞得有点复杂了,并不用转换成字符数组的,直接使用charAt()就可以的,这道题的整体思路还是比较简单的
在代码随想录中,提供了一个双指针的方法,这个方法适用于C++语言,但是不适用于java语言,因为java中的String对象是不可改变的,不能进行原地修改和扩容,但是思路确实很妙,空间复杂度是O(1),但是对java语言不适用
替换空格
方法一:
class Solution { public String replaceSpace(String s) { StringBuilder ss = new StringBuilder(); for (int i = 0 ; i < s.length(); i++) { if (s.charAt(i) == ' ') { ss.append("%20"); } else { ss.append(s.charAt(i)); } } return ss.toString(); } }
方法二(原地扩容,不适合java):
// 摘自《代码随想录》网站 class Solution { public String replaceSpace(String s) { if(s == null || s.length() == 0){ return s; } //扩充空间,空格数量2倍 StringBuilder str = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == ' '){ str.append(" "); } } //若是没有空格直接返回 if(str.length() == 0){ return s; } //有空格情况 定义两个指针 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 new String(chars); } }
151.反转字符串里的单词
题目链接:力扣
思路
题目中说,字符串中会出现前导空格和尾随空格的情况,所以我们首先将字符串前后的空格去掉,然后对整个字符串进行分割,如果每个单词之间只有一个空格,那分割出来的整个数组就只有单词,但是如果中间有多个空格,会分割出来空字符串
接下来对字符串进行重组,注意空字符串不要添加进去,注意不是空格,是空字符串
反转字符串里的单词
第一步:清空字符串两边的空格
第二步:使用空格字符串分割字符串(分割出来的数组元素有可能存在空字符串)
第三步:进行判断,从数组后面一个元素往后添加
class Solution { public String reverseWords(String s) { s = s.trim(); StringBuilder sb = new StringBuilder(); String[] ss = s.split(" "); for (int i = ss.length - 1; i > 0; i--) { if (!ss[i].equals("")) { sb.append(ss[i]); sb.append(" "); } } sb.append(ss[0]); return sb.toString(); } }
剑指Offer58-II.左旋转字符串
题目链接:力扣
思路
前面部分要移动到后面,那就创建一个空字符串,先添加后面的,再添加前面的就可以
左旋转字符串
class Solution { public String reverseLeftWords(String s, int n) { // 定义一个接收字符串 StringBuilder sb = new StringBuilder(); // 先添加后面的字符 for (int i = n; i < s.length(); i++) { sb.append(s.charAt(i)); } for (int i = 0; i < n; i++) { sb.append(s.charAt(i)); } return sb.toString(); } }