✔做题思路 or 感想 :
-
乍一看很猛,其实思路就仨
- 把整个字符串反转
- 删除多余空格
- 然后再把每一个单词反转
-
反转,删除空格用的都是双指针法,太香了
-
数组中的删除操作总体思想虽然是把符合条件的数往前面推,但这个"推"并不是交换值!而是直接往前面把不符合条件的值直接替换了!!!
class Solution { public: string reverseWords(string s) { reverse(s.begin(), s.end()); int fast = 0, slow = 0; while (s[fast] == ' ' && fast < s.size()) { //这里是先要删除前面的空格 fast++; } for (; fast < s.size(); fast++) { //去除中间空格 if (fast > 1 && s[fast - 1] == s[fast] && s[fast] == ' ')continue; else { //注意这里的删除操作,不是用swap替换!而是直接就把后面符合条件的直接替换前面不符合条件的数!!!! s[slow] = s[fast]; slow++; } } //下面是为了处理后面末尾的空格 if (slow > 0 && s[slow - 1] == ' ')s.resize(slow - 1); else s.resize(slow); //下面是对每一个单词的反转 fast = 0, slow = 0; for (; fast < s.size(); fast++) { if (fast == s.size() - 1) { reverse(s.begin() + slow, s.end()); } else if (s[fast + 1] == ' ') { reverse(s.begin() + slow, s.begin() + fast + 1); slow = fast + 2; //slow找下一个单词的起点 fast++; } } return s; } };