42翻转单词顺序列+注意该题找单词的方法

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
 
 
思路:两步反转法,先整体反转,然后每个单词进行反转。
找单词的方法是找相应的空格。
如果start的位置是空格就++,如果end的地方是空格就--或者是末尾结束符,就进行反转,一定要记得自己定义一个反转函数。
其他在单词中间的情况就++end。找空格。
class Solution {
public:
    void helper(string &str,int start,int end){
        for(start,end;start < end;++start,--end){
            swap(str[start],str[end]);
        }
    }
    string ReverseSentence(string str) {
        if(str.size() == 0){
            return "";
        }
        
        helper(str,0,str.size() - 1);
        int start = 0,end = 0;
        while(str[start] != '\0'){
            if(str[start] == ' '){
                ++start;
            }
            else if(str[end] == ' ' || str[end] == '\0'){
                helper(str,start,end - 1);
                start = end;
                ++end;
            }
            else{
                ++end;
            }
        }
        return str;
    }
};

这道题目还有进一步的变式题,就是两个单词之间有很多空格,最后只输出一个空格,这题的话,可以使用istringstream in(string),然后自己依据空格分割每一个单词,存储到一个数组里面,再从最后一个单词开始开始拼接,就得到了结果。

class Solution {
public:
    /**
     * @param s : A string
     * @return : A string
     */
    
  string reverseWords(string s) {
    // write your code here
    if (s.size() < 2) {
        return s;
    }
    istringstream ss(s);
    string tmp, result;
    vector<string> no_space;
    while (ss >> tmp) {
        no_space.push_back(tmp);
    }
    if(no_space.size() == 0){
        return " ";
    }
    int i;
    for (i = no_space.size() - 1; i > 0; --i) {
        result.append(no_space[i]);
        result.append(" ");
    }
    result.append(no_space[i]);
    return result;
}
};

 

 
posted @ 2018-01-05 23:11  zqlucky  阅读(205)  评论(0编辑  收藏  举报