Reverse Words in a String
原题连接:https://oj.leetcode.com/problems/reverse-words-in-a-string/
runtimes:9ms
一、实例
如字符串:“ hello world ! ”,输出应该为 “!world hello”。
二、分析
输入一个字符串,将其中的单词反序输出,单词间需要用一个空格隔开;注意:头尾不能有空格,单词间空格只能有一个。
问题很简单,但是却纠结了我很长时间,原因是因为我以为需要输出,所以每次都把结果输出,结果总是wrong answer,比如数据“ a b ”,总会跑出“a b”,但是在自己的编译器上面却是“b a”正确答案。参考了他人的代码后,我发现问题要求其实是将原来字符串参数s赋值为最终结果即可,自己画蛇添足了,需要反省。
三、总结
1、第一种方案是字符串从后往前扫描,遇到空白字符跳过,遇到字母开始记录,直到遇到空格如此循环直到扫描结束。
2、第二种方案是利用了string流操作istringstream,需要include <sstream>头文件,可与java字符中的split操作相比。
3、第一,需要系统总结一下string的库函数使用;第二,leetcode中自动include <algorithm>函数,其次有些题目是不用输出的,切记。
四、实现
方案一:
class Solution {
public:
string revers(string &s){
for (int i = 0, j = s.size() - 1; i < j; i++, j--)
{
char c = s[i];
s[i] = s[j];
s[j] = c;
}
return s;
}
void reverseWords(string &s)
{
string result = "";
for (int i = s.size() - 1; i >= 0;)
{
while (i >= 0 && s[i] == ' ') i--;
if (i < 0) break;
string str = "";
while (i >= 0 && s[i] != ' ')
{
str += s[i];
i--;
}
result += revers(str) + ' ';
}
if (result.size() > 0)
{
string::iterator iter = result.end() - 1;
iter = result.erase(iter);
}
s = result;
}
};
方案二:
#include<vector>
#include<sstream>
class Solution {
public:
void reverseWords(string &s)
{
vector <string> strVec;
istringstream is(s);
string rs;
while (true)
{
string str;
is >> str;
if (str == "")
break;
strVec.push_back(str);
}
if (strVec.size() > 0)
{
for (int i = strVec.size() - 1; i >= 0; i--)
{
rs += strVec[i];
if (i != 0)
rs += ' ';
}
}
s = rs;
}
};
五、对比
找到了一个14ms的解法,其代码甚妙,首先是对于第7、8行判断的放置,7行避免了在最后多加一个空格,8函则记得在单词后多加一个空格,这样设置减少了最后对字符串的处理;第二他利用了algorithm库函数reverse,感觉这个库挺不错的;第三,对string的操作熟悉,值得学习。
题目连接:http://blog.csdn.net/kenden23/article/details/20701069