牛客网剑指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 };
stay foolish,stay hungry