344.反转字符串
思路:
由于是数组存储,只需要双指针分别在首尾向中间交换即可
看代码后:
可以用库函数swap(s[i],s[j])交换
541. 反转字符串II
思路:
times=size/2k得到循环的次数,remainder=size%2k得到循环后的余数与k进行比较分类讨论。i为正在循环的次数-1
循环内:left=i*2k,right=left+k-1;
remainder<k时:left=2*k*i,right=size-1;
其他:left=i*2k,right=left+k-1;
看视频后:
i进行2k范围的跳转,如果i+k<size,则反转前k个,否则全部反转。可以自己在前面写一个左闭右闭的反转函数。
剑指Offer 05.替换空格
思路:
先遍历一遍找到空格的数量,根据数量新建一个char数组,分情况讨论。判断A[i]元素是否为空格,最后将char转成string newstr(B),返回newstr.
看代码后:
先遍历一遍找到空格数量,C++的string有resize函数,然后用双指针从后往前刷新元素,i和j分别从newsize-1和oldsize-1出发,循环条件为j<i;
151.翻转字符串里的单词
思路:
新建一个char数组,试图用双指针从后往前复制元素。
看视频后:
这个问题可以分解成三步:
1.删除冗余空格
2.反转整个字符串
3.反转单词
删除冗余空格分成首部中部尾部的空格,分情况讨论。反转记得注意下标计算。
剑指Offer58-II.左旋转字符串
思路:
记录oldsize,resize(oldsize+n),然后将前面的元素用循环复制到后面,再双指针将元素挪前N位,最后resize(oldsize).
看代码后:
如果不申请额外空间,可以分成三部分:1.反转区间为前n的子串2.反转区间为n到末尾的子串3.反转整个字符串
三次reverse即可