前阵子实习项目任务繁重,加上本人惰性,一直未打卡,现在实习结束,开始补天
151.翻转字符串里的单词
解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
举个例子,源字符串为:"the sky is blue "
- 移除多余空格 : "the sky is blue"
- 字符串反转:"eulb si yks eht"
- 单词反转:"blue is sky the"
这一题最难理解的一点在于如何将多余的空格去掉的同时再在单词之间留下一个空格,这里我附上代码随想录里的解答:
void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html
for (int i = 0; i < s.size(); ++i) { //
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow); //slow的大小即为去除多余空格后的大小。
}
首先看到其中的两个if语句
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
这里看到一定会想到这里是不是每个字母后都加了一个空格了,其实不然,这里的判断都是在一个单词打印完之后进行的判断,原因在于后面的while循环一次性打印完一个单词之后,才会结束整个for循环的一个循环,并且无论是for循环还是while循环,两者都对 i 有 加操作。
另一个需要注意的点使,在代码随想录给出的题解中,最终主函数里的for循环结束的条件是 i <= s.size(),因为后面每个单词的翻转都要到单词后一位再减一,详情看题解。
55.右旋转字符串
此题重点在于两次翻转,整体翻转再加局部翻转可以实现。
28. 实现 strStr()
459.重复的子字符串
28和459是KMP算法,等我一刷回来再啃