返回

五分钟搞懂「剑指 Offer 58 - I. 翻转单词顺序」难题,C++代码实现!

前端

翻转单词顺序:巧解经典编程谜题

在软件开发的王国中,“剑指 Offer 58 - I. 翻转单词顺序”是一个备受推崇的谜题,以其优雅的解法和对编程基本功的考验而闻名。准备踏上征服这座编程珠峰的征程了吗?让我们深入探索它的奥秘吧!

问题剖析:剑指迷津

谜题阐述:

你有一段文字,需要把其中的每个单词的字母顺序颠倒过来,但不能改变单词之间的空格位置。

示例:

输入:hello world
输出:world hello

解题思路:抽丝剥茧

破解这道谜题的关键在于分而治之。首先,我们将输入字符串按照空格分隔成一个单词数组。然后,我们遍历这个数组,将每个单词的字母顺序颠倒过来。最后,我们将这些颠倒的单词重新组合成一个字符串,就是谜题要求的输出。

代码实现:挥洒代码魅力

以下是使用 C++ 语言实现的代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

string reverseWords(string s) {
    // 将字符串拆分成单词数组
    vector<string> words;
    string word;
    for (char c : s) {
        if (c == ' ') {
            if (!word.empty()) {
                words.push_back(word);
            }
            word.clear();
        } else {
            word += c;
        }
    }
    if (!word.empty()) {
        words.push_back(word);
    }

    // 颠倒每个单词的字母顺序
    for (string& word : words) {
        reverse(word.begin(), word.end());
    }

    // 将颠倒的单词重新组合成字符串
    string result;
    for (string word : words) {
        result += word + " ";
    }
    result.pop_back(); // 去掉最后一个空格

    return result;
}

int main() {
    string input = "hello world";
    string output = reverseWords(input);
    cout << "Input: " << input << endl;
    cout << "Output: " << output << endl;
    return 0;
}

复杂度分析:量化性能

  • 时间复杂度: O(n),其中 n 是输入字符串的长度。
  • 空间复杂度: O(n),其中 n 是输入字符串的长度。

总结:登顶珠峰

恭喜你成功攻克了“剑指 Offer 58 - I. 翻转单词顺序”!这道谜题不仅考验了你的编程功底,还激发了你的创造性思维。记住,编程的奥秘在于拆解问题、制定策略和编写优雅的代码。继续征服编程世界的其他高峰吧!

常见问题解答:解惑释疑

1. 为什么不能直接用 reverse() 函数颠倒整个字符串?

因为那样会把单词之间的空格也颠倒过来,这不符合谜题要求。

2. 能否使用正则表达式来解决这个谜题?

可以,但正则表达式的方法会更复杂,而且可读性较差。

3. 颠倒单词时,是否可以忽略大小写?

根据谜题要求,颠倒时应保留大小写。

4. 如果输入字符串中有标点符号怎么办?

标点符号不属于单词,因此不需要颠倒。

5. 如何处理连续的空格?

连续的空格应保持不变,不作为单词分隔符。