给定一个字符串,逐个翻转字符串中的每个单词。
说明
- 单词的构成:无空格字母构成一个单词
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
解题思路1:
1、先翻转整个字符串,再把每个单词反转,得到结果。
class Solution {
public:
/*
* @param s: A string
* @return: A string
*/
string reverseWords(string &s)
{
// write your code here
reverse(s.begin(), s.end());//对整个字符串进行反转
while(*s.begin() == ' ')//消除掉头部为空格的字符
s.erase(s.begin());
string::iterator wordBegin = s.begin();//指向每个单词的头部
string::iterator wordEnd;//指向每个单词的尾部+1,实现前闭后开的区间,与STL保持一致
string::iterator it;//遍历整个字符串的指针
//除尾部单词外,其余每个单词反转
for (it = s.begin(); it != s.end(); it++)
{
if (*it == ' ')
{
wordEnd = it;//调整wordEnd指针指向当前单词的尾部
reverse(wordBegin, wordEnd);
wordBegin = it + 1;//调整wordBegin指针指向下一个单词的首部
}
}
//此时it指向a.end(),将尾部单词也反转
wordEnd = it;
reverse(wordBegin, wordEnd);
return s;
}
};
解题思路2:
先以空格分割出每个单词,然后从后向前依次添加单词即可。
注意需要考虑到单词之间有多个空格的存在,所以在append之前需要判断
还需要考虑前导和后缀空格
public class Solution {
/*
* @param s: A string
* @return: A string
*/
public String reverseWords(String str) {
// write your code here
if(str.trim().equals(""))
return str;
String[] strs = str.split(" ");
StringBuilder sb = new StringBuilder();
for(int i=strs.length-1; i>=0; i--){
if(!strs[i].equals(""))
sb.append(strs[i]+" ");
}
return sb.toString().trim();
}
}

1696

被折叠的 条评论
为什么被折叠?



