344.反转字符串-Temp交换
--New
541. 反转字符串II-Temp交换
题目链接/文章讲解/视频讲解:代码随想录
(1)思路总结
(2) 代码
--New
剑指Offer 05.替换空格 --数组填充、双指针
题目链接/文章讲解:代码随想录
(1)思路总结
如果想把这道题目做到极致,就不要只用额外的辅助空间了!首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
为什么要从后向前填充,从前向后填充不行么?从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
· 不用申请新数组。
· 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
(2)代码
--New
151.翻转字符串里的单词
题目链接/文章讲解/视频讲解:代码随想录
(1)思路总结
(2) 代码
--New
for(int end=0;end<=chars.length;end++){
if(end==chars.length || chars[end]==' '){
reverse(chars,start,end);
start=end+1;}
}
//end到底能不能取到chars.length很重要。但是要保证对chars[end]==' '也适用,因此end==chars.length-1不行,reverse(chars,start,end)就不能都用end统一了。
剑指Offer58-II.左旋转字符串-先反转前n个后反转n到末尾最后反转整个字符串
题目链接/文章讲解:代码随想录
(1)思路总结
(2) 代码
--New
其他补充
-
//自己定义的交换字符的函数,遵循左闭右开
public void reverse(char[] ch,int i,int k){
for(int j=k-1 ; i<j ; i++,j--){
char temp=ch[i];
ch[i]=ch[j];
ch[j]=temp;}
}
-
char[] ch=s.toCharArray(); //string转为char数组
-
for(int i=0;i<ch.length;i+=2*k) //打破刻板印象,不是每次都是i++,这里i每次跳2k的距离
-
return new String(ch); //最后返回需要返回字符串,而现在是字符数组
-
StringBuilder 只是拼接字符串的手段,最终的目的还是要恢复成 String 类型。
StringBuilder stb = new StringBuilder();
String str = stb.toString();
-
s += str.toString(); //字符串可以直接通过‘+’号拼接
-
System.arraycopy(chars,0,newchars,0,slow);
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) // src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度.
-
在Java中,reverse是用于反转字符串的方法,它是StringBuilder和StringBuffer类的一个成员方法。
StringBuilder sb=new StringBuilder(s);
return sb.reverse().toString();
-
char temp=sb.charAt(start); //string和StringBuilder都可以根据下标获得相应字符
sb.setCharAt(start,sb.charAt(end)); //StringBuilder更改对应下标的字符setCharAt(位置,值)