题. 翻转单词顺序
输入一个英文句子, 单词之间用一个空格隔开,且句首和句尾没有多余空格。
翻转句子中单词的顺序,但单词内字符的顺序不变。
为简单起见,标点符号和普通字母一样处理。
例如输入字符串"I am a student."
,则输出"student. a am I"
。
数据范围
输入字符串长度 [0,1000]。
样例
输入:"I am a student."
输出:"student. a am I"
【题解】--- 双指针
- 用 i 遍历字符串,遇到字母空格后的字母即为单词首字母。
- 然后,用 j = i 开始往后遍历,找到下一个空格或者走到字符串末尾停止。
- 此时,如果 j 不是字符串结尾,则i 和 j 之间就是单词,用 k 遍历 i 到 j - 1,得到单词。如果 j 指向 是字符串末尾,则 s[j] 也是单词一部分,加入。
- 将得到的字符串加在结果前面。如果 j 不是字符串末尾,说明后面还有单词,则结果前面再加个空格。
- 最终输出结果。
复杂度分析:
时间复杂度是O(n^2)。
C++代码实现:
class Solution {
public:
string reverseWords(string s) {
string res;
for(int i = 0; i < s.size(); i++)
{
while(s[i] == ' ') i++;//找到单词首字母
int j = i;
while(j < s.size() && s[j] != ' ') j ++;//找到单词末尾
string temp;//保存单词
for(int k = i; k < j; k++) temp += s[k];
if(j == s.size() - 1) temp = s[j] + temp;//如果j是字符串末尾,则单词中加入s[j]。
if(j != s.size()) res = ' ' + temp + res;//如果不是字符串末尾,则结果中需要加入空格
else res = temp + res;//是字符串末尾,则不需要加入空格。
i = j ;//找下一个单词
}
return res;//返回结果
}
};