• 剑指offer58. 翻转单词顺序


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

    • 无空格字符构成一个单词。
    • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
    class Solution {
    public:
        string reverseWords(string s) {
            reverse(s.begin(), s.end());
            int idx = 0, n = s.size();
            for (int i = 0; i < n; ++i) {
                if (s[i] != ' ') {
                    // idx记录上一个单词结尾的位置
                    // 如果不是第一个单词,两个单词间要插个空格
                    if (idx != 0) s[idx++] = ' ';
                    // 原串新单词开始的索引j
                    int j = i;
                    // 单词要整体左移,覆盖掉两个单词间多余的空格
                    while (j < n && s[j] != ' ') {
                        s[idx++] = s[j++];
                    }
                    // 翻转更新后的s的当前单词
                    reverse(s.begin() + idx - (j - i), s.begin() + idx);
                    i = j;
                }
            }
            // 删除最后一个单词后的所有空格
            s.erase(s.begin() + idx, s.end());
            return s;
        }
    };
  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/betaa/p/12671027.html
Copyright © 2020-2023  润新知