解题思路
这是一个字符串处理问题。需要将句子中的单词顺序倒置,但保持标点符号位置不变。
关键点:
- 分割字符串获取单词
- 处理标点符号
- 倒序重组单词
- 保持原有格式
算法步骤:
- 分割字符串为单词
- 倒序重组单词
- 处理标点符号
- 输出结果
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string solve(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);
}
// 倒序重组
string result;
for (int i = words.size() - 1; i >= 0; i--) {
result += words[i];
if (i > 0) result += " ";
}
return result;
}
};
int main() {
string s;
while (getline(cin, s)) {
Solution solution;
cout << solution.solve(s) << endl;
}
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public String solve(String s) {
// 分割单词
String[] words = s.split(" ");
// 倒序重组
StringBuilder result = new StringBuilder();
for (int i = words.length - 1; i >= 0; i--) {
result.append(words[i]);
if (i > 0) result.append(" ");
}
return result.toString();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String s = sc.nextLine();
Solution solution = new Solution();
System.out.println(solution.solve(s));
}
sc.close();
}
}
class Solution:
def solve(self, s):
# 分割单词并倒序
words = s.split()
words.reverse()
# 重组句子
return ' '.join(words)
# 持续读取输入直到EOF
while True:
try:
s = input()
solution = Solution()
print(solution.solve(s))
except EOFError:
break
算法及复杂度
- 算法:字符串处理
- 时间复杂度:,其中 是字符串长度
- 空间复杂度:,需要存储分割后的单词