Address : https://oj.leetcode.com/problems/reverse-words-in-a-string/
问题描述:给一个string类型的字符串,让你将单词按照逆序输出。
分析:这道题题意十分简单,唯一容易出错的地方就是输入数据的类型。在写代码之前首先设计测试用例是一个比较良好的习惯,那么可以想想有哪些特殊的输入情况,然后在写代码的时候加以判断。
s = “the sky is blue”
s = " the sky is blue "
s = ""
s = " "
s = "1"
算法设计:
1.首先过滤到前缀空格,以及考虑s为空的情况。要养成判断参数的习惯,才能让软件鲁棒性更强。
2.然后用C语言里面的字符串截取函数按照空格将s截取成为一个个单词。
3.将单词放到vector容器里面,然后从后往前拼接成新的字符串,完成逆序。
PS:代码写的不是很简洁,甚至有点繁琐,值得注意的是strtok函数。
AC代码:
class Solution {
public:
void reverseWords(string &s) {
int i=0;
while( i<s.length() && s.at(i) == ' ' )
{
i++;
}
if( i==s.length() )
{
s = "";
return;
}
vector<string> vec;
char *ptr;
char *q = new char[s.length()+2];
strcpy(q, s.c_str());
ptr = strtok(q," ");
while(ptr!=NULL)
{
vec.push_back(ptr);
ptr = strtok(NULL," ");
}
//string str;
s.clear();
for(i=vec.size()-1;i>=1;i--)
{
s += vec[i];
s += " ";
}
s += vec[0];
}
};
像这种逆序的问题有几种思维方向:0.重新组织数据结构;1.递归;2.用栈;
下面稍微提一下strtok这个截取函数,在此不去探究这个API的实现机制,仅仅举一个应用例子:
/* strtok example */
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
<strong>pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}</strong>
system("pause") ;
return 0;
}
结果: