题目要求:
给定一个字符串,逐个翻转字符串中的每个单词。
说明
- 单词的构成:无空格字母构成一个单词
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
思路:
刚开始没搞明白,还以为是要把每一个单词内字母的前后顺序颠倒,原来是把单词顺序颠倒啊……
第一步,如果是空则返回空。剩下的写了注释。
代码:
class Solution {
public:
/*
* @param s: A string
* @return: A string
*/
string reverseWords(string &s) {
// write your code here
if(s == "") return s;
int i, j;
int n = 0; //计数
int flag = 0; //记录第0位置的字符是否已经被添加过
string a; //初始字符串
for(i = s.length() - 1; i >= 0; i--){ //倒着从后往前遍历
if((s.at(i) == ' ' || i == 0) && n > 0){
if(i == 0){ //遍历到第0位置的时候,进入这一步说明第0位置不是空格
j = 0;
flag = 1;
}
else j = i + 1; //这个时候s[i]是空格,所以要从后一个开始遍历添加
for(; j <= i+n; j++){
cout<<s.at(j)<<endl;
a += s.at(j);
}
a += ' '; //添加末尾的空格
n = 0; //重置n
continue;
}
if(s.at(i) != ' '){ //如果不是空格,n++
n++;
}
}
if(flag == 0 && n == 1)
a += s.at(0); //如果没有添加第0位置的并且第0位置不是空格,那么加入
if(a[a.length()-1] == ' ')
a.erase(a.length()-1, 1); //如果最后一位是空格,删除
return a;
}
};