关键是处理前后和中间的空格,关键代码:
last = 0;
for(int i = 0; i < len; i++)
if(s[i] != ' ' || (last && s[last-1] != s[i]))
s[last++] = s[i];
'#'定义为' '
XXX###XX#### ==> XXX#XX#
if(s[i] == ' ' && last && s[last-1] != s[i]) 这个逻辑保证X后面的#可以保存下来,避免中间的#都被删除掉
void reverse(char *s, int l, int r)
{
while(l < r){
char tmp = s[l];
s[l] = s[r];
s[r] = tmp;
l++;
r--;
}
}
void reverseWords(char *s) {
if(s == NULL)
return;
int len = strlen(s);
if(len == 0 )
return;
//remove white space
int last = 0;
for(int i = 0; i < len; i++)
if(s[i] != ' ' || (last && s[last-1] != s[i]))
s[last++] = s[i];
if(last == 0) // 说明全是空格
{
s[last] = '\0';
return;
}
if(s[last-1] == ' '){ //原字符串尾部有空格 ,处理完后最后一个字符后面的空格还会保存,需要替换为'\0'
s[last-1] = '\0';
len = last-1;
}else{//原字符串尾部没有空格,之前把当前last 指向设置为字符串结尾标志'\0'
s[last] = '\0';
len =last;
}
int l = 0;
int r = 0;
for(int i = 0; i <= len; i++){
if(s[i] == ' ' || s[i] == '\0'){
r = i-1;
reverse(s, l , r);
l = i+1;
}
}
reverse(s, 0, strlen(s)-1);
}