剑指 Offer 58 - I. 翻转单词顺序×

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

复制代码
 1 class Solution {
 2 public:
 3     //利用容器的方法
 4     string reverseWords(string s) {
 5         vector<string> vec;
 6         string::size_type i = 0, j;
 7         while (i < s.size())
 8         {
 9             string tmp;
10             while(s[i] == ' ') i++;
11             j = i;
12             while (j < s.size() && s[j] != ' ') j++;
13             /*if (j == s.size() - 1) j++;*/
14             int len = j - i;
15             if (len == 0) continue;
16             tmp.assign(s, i, len);
17             vec.push_back(tmp);
18             i = i + len;
19         }
20         int left = 0;
21         int right = vec.size() - 1;
22         string tmp;
23         while (left < right)
24         {
25             tmp = vec[left];
26             vec[left] = vec[right];
27             vec[right] = tmp;
28             left++;
29             right--;
30         }
31         string res;
32         for (vector<string>::size_type k = 0; k < vec.size(); k++)
33         {
34             string cur;
35             if (k == vec.size() - 1)
36             {
37                 cur = vec[k];
38             }
39             else {
40                 cur = vec[k] + ' ';
41             }
42             res.append(cur);
43         }
44         return res;
45     }
46     void reverse(string& s, int start, int end) { //翻转,区间写法:左闭右闭 []
47         for (int i = start, j = end; i < j; i++, j--) {
48             swap(s[i], s[j]);
49         }
50     }
51 
52     void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
53         int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.html
54         for (int i = 0; i < s.size(); ++i) { //
55             if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
56                 if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
57                 while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
58                     s[slow++] = s[i++];
59                 }
60             }
61         }
62         s.resize(slow); //slow的大小即为去除多余空格后的大小。
63     }
64 
65     string reverseWords1(string s) {
66         removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。
67         reverse(s, 0, s.size() - 1);
68         int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。
69         for (int i = 0; i <= s.size(); ++i) {
70             if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
71                 reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
72                 start = i + 1; //更新下一个单词的开始下标start
73             }
74         }
75         return s;
76     }
77 };
复制代码

 

posted @   xiazichengxi  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩