反转字符串中的单词
class Solution { public: void reverse(string& s, int start, int end){ //反转单词字符串,写法为左闭右闭,包括start和end for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } } void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。 int slow = 0; // for (int i = 0; i < s.size(); ++i) { //i是快指针,跳过所有空格,只读取非空格数据 if(s[i] != ' '){ if(slow != 0) s[slow++] = ' '; //此时i指向新单词的开头,所以slow向前移一位,并且手动补上空格。 while(i < s.size() && s[i] != ' '){ s[slow++] = s[i++]; } } } s.resize(slow); //slow的大小即为去除多余空格后的大小。 } string reverseWords(string s) { removeExtraSpaces(s); reverse(s, 0, s.size() - 1); //反转整个字符串 int start = 0; for(int i = 0; i <= s.size(); i++){ //指向最后或者指向空格 if(i == s.size() || s[i] == ' '){ reverse(s, start, i - 1); start = i + 1;//跳过空格 } } return s; } };
算是阶段性考核了,其实题目用到的方法都是之前的方法,但是很多细节要注意。自己尝试写了写还是很费神而且边写边改越改思路越乱。比如快慢指针去空格时去掉后还需要添加上一个。还有最后挨个单词反转字符串,自己写就漏掉了末尾的单词。
标签:单词,slow,start,int,++,空格,Day15,LeetCode,刷题 From: https://www.cnblogs.com/tianmaster/p/16890932.html