關鍵是處理前后和中間的空格,關鍵代碼:
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{//原字符串尾部沒有空格,之前把當前l(fā)ast 指向設置為字符串結(jié)尾標志'\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);
}