返回
五分钟搞懂「剑指 Offer 58 - I. 翻转单词顺序」难题,C++代码实现!
前端
2023-11-16 22:06:51
翻转单词顺序:巧解经典编程谜题
在软件开发的王国中,“剑指 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. 如何处理连续的空格?
连续的空格应保持不变,不作为单词分隔符。