解题思路:
1 O(n) runtime O(n) space
从字符串尾部开始扫描,记录单词的开始和结束位置
<span style="font-family:Microsoft YaHei;font-size:14px;">void reverseWords(char *s) {
int len = strlen(s);
char *str = (char *)malloc(sizeof(char) * len + 1);
int i,j,k,m;
j = len;
k = 0;
for(i = len -1; i >= 0; i--){
if(s[i] == ' '){
j = i;
}else if(i == 0 || s[i-1] == ' '){
if(k != 0) str[k++] = ' ';
for(m = i; m < j; m++){
str[k++] = s[m];
}
}
}
str[k] = '\0';
strcpy(s,str); //注意,不要使用s = str;
}</span>
写这段代码的时候容易出错,有几个地方要特别注意
2 O(n) runtime O(1) space
两次反转。先将整个句子反转,然后每个单词反转。本来思想比较简单直接,扫描两遍即可O(N)。空格的处理坑死人。 注意处理句子两头的空格,单词间隔中间多个空格的压缩成一个空格。
例如:the sky is blue
第一次反转(整个句子):eulb si yks eht
第二次反转(每个单词):blue is sky the
补充:
关于C语言的字符数组初始化化
char amessage[] = "hello world!"
与 char *pmessage = "hello world!"
的区别,需要注意。