✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
题目描述
输入一个英文句子,单词之间用一个空格隔开,且句首和句尾没有多余空格。
翻转句子中单词的顺序,但单词内字符的顺序不变。
为简单起见,标点符号和普通字母一样处理。
例如输入字符串
"I am a student."
,则输出"student. a am I"
。数据范围
输入字符串长度 [0,1000]。
样例
输入:"I am a student."输出:"student. a am I"
方法一:双指针 O(n)
具体思路如下:
- 用两个指针来遍历字符串
s
,截取出每个单词,单词所在区间为[i,j)
,然后将该单词反转。 - 当所有单词反转完之后,再反转整个字符串,这样得到的效果就是最终答案。
我们拿题目样例进行举例,假设现在要翻转字符串 I am a student.
的单词顺序:
第一步: 找到第一个单词,并翻转。
第二步: 找到第二个单词,并翻转。
第三步: 找到第三个单词,并翻转。
第四步: 找到第四个单词,并翻转,注意这里的单词相当于一个字符串,其中是可以包含 .
号的。
第五步: 所有单词都已经翻转完,最后对整个字符串进行翻转,得到的结果就是最终答案。
class Solution {
public:string reverseWords(string s) {for (int i = 0; i < s.size(); i++){int j = i;while (j < s.size() && s[j] != ' ') j++;reverse(s.begin() + i, s.begin() + j);i = j;}reverse(s.begin(), s.end());return s;}
};
欢迎大家在评论区交流~