• 牛客网剑指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 };
  • 相关阅读:
    LeetCode: Maximum Product Subarray 解题报告
    LeetCode: Populating Next Right Pointers in Each Node II 解题报告
    LeetCode: Populating Next Right Pointers in Each Node 解题报告
    LeetCode: Word Search 解题报告
    C语言文件操作
    多线程
    C语言函数指针的使用
    进程
    网络编程
    进程间通信——管道通信
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12503939.html
Copyright © 2020-2023  润新知