翻转单词顺序列

翻转单词顺序列

题目描述

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

牛客上看的这个简洁

class Solution {
public:
    string ReverseSentence(string str) {
        string ret = "";
        string temp = "";
        
        for (int i = 0; i < str.length(); i++) {
            if (' ' == str[i]) {    // 交换单词顺序, 并在前面添加空格
                ret = ' ' + temp + ret;
                temp = "";
            }
            else {                // 翻转单词
                temp += str[i];
            }
        }
        
        // 这里交换上一个for循环中并没有交换最后一个单词
        if (str.length()) {
            ret = temp + ret;
        }
        
        return ret;
    }
};

这个和下面那个只差翻转单词时的定位不同, 下面那个用两个变量界定单词范围, 这个使用三个变量界定单词范围

class Solution {
public:
    void reverseWorld(string &str, int begin, int end) {
        while (begin < end) {
            swap(str[begin++], str[end--]);
        }
    }
    
    string ReverseSentence(string str) {
        if(1 >= str.length()) {
            return str;
        }
        int begin = 0;
        int end = str.length() - 1;
        // 翻转字符串
        reverseWorld(str, begin, end);

        begin = end = 0;
        int i = 0;
        while (i < str.length()) {
            while ((i < str.length()) && str[i] == ' ') {
                i++;
            }
            begin = i;    // 单词开始位置
            while ((i < str.length()) && str[i] != ' ') {
                i++;
            }
            end = i - 1;    // 单词结束位置
            // 翻转单词
            reverseWorld(str, begin, end);
        }
        return str;
    }
};
class Solution {
public:
    void reverseWorld(string &str, int begin, int end) {
        while (begin < end) {
            swap(str[begin++], str[end--]);
        }
    }
    
    string ReverseSentence(string str) {
        // 翻转字符串
        if(1 >= str.length()) {
            return str;
        }
        int begin = 0;
        int end = str.length() - 1;
        reverseWorld(str, begin, end);
        
        begin = 0;
        end = 0;
        while (end < str.length()) {
            while ((end < str.length() - 1) && (' ' != str[end])) {
            //while (' ' != str[end]) {    // 定界错误
                end++;
            }
            
            if (end == str.length() - 1) {
                reverseWorld(str, begin, end);
                break;
            }
            else {
                reverseWorld(str, begin, end - 1);
                begin = end + 1;
                end += 1;
            }
            
        }
        return str;
    }
};
posted @ 2019-03-13 21:29  张飘扬  阅读(837)  评论(0编辑  收藏  举报