牛客网剑指offer第44题——翻转单词顺序列

题目如下:

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

这道题的解法很多,当时脑海里有好几种思维方式。这里仅仅说一种我当时很快觉得靠谱的.

既然是反转单词顺序,那么肯定有两点需要关注:

1.应该从最后一个单词反向向第一个单词遍历。

2.既然是单词反向排列顺序,我们自然要想到单词的分隔符’ ‘(即空格)

3 这里容易犯一个错误,认为单词和单词之间只有一个空格。但实际上,单词与单词之间的空格未必只有一个

实际上,我在写程序的时候,对于上述第三点,犯了很严重的错误,认为单词和单词之间只有一个空格。实际上,我们应该原封不动的统计源字符串中有多少空格。我使用了双索引的技术来实现字符串的翻转。一个索引位于单词的开头前一个位置,一个索引位于单词的末尾,程序如下:

 1 class Solution {
 2 public:
 3    string ReverseSentence(string str) {
 4         int index1 = str.length()-1;
 5         int index2 = index1;
 6         string res="";
 7        if(index1 == -1)
 8            return res;
 9         while(index2>=0)
10         {
11              while(str[index2] !=' ')
12              {
13                  index2--;
14                  if(index2 == -1)
15                      break;
16              }
17             res = res+str.substr(index2+1,index1-index2);//完成将字符串加入结果中
18             if(index2 == -1)//如果遍历到了最靠头,最后一个单词后面后面是没有空格的,我们不需要进行空格遍历
19                 break;
20             //需要注意的是空格可能不止一个,因此科学的做法并不统计空格的数量
21              index1 = index2;//反向第一个空格
22             while(str[index2] == ' ')
23             {
24                 index2--;   
25             }
26              res =res +str.substr(index2+1,index1-index2);//将原字符串的若干空格加入结果中
27             index1 = index2;
28         }
29         return res;
30     }
31 };
原文地址:https://www.cnblogs.com/shaonianpi/p/12503939.html