給定一個字符串,逐個翻轉字符串中的每個單詞。
示例 1:
輸入: "the sky is blue"
輸出: "blue is sky the"
示例 2:
輸入: " hello world! "
輸出: "world! hello"
解釋: 輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
示例 3:
輸入: "a good example"
輸出: "example good a"
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
說明:
無空格字符構成一個單詞。
輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
進階:
請選用 C 語言的用戶嘗試使用 O(1) 額外空間複雜度的原地解法。
使用O(1)解法
void reverse(char *s,int size)
{
int i;
char c;
for (i=0;i<size/2;i++){
c=s[i];
s[i]=s[size-i-1];
s[size-i-1]=c;
}
}
char * reverseWords(char * s){
int tmp=0;
if (s==NULL)
return NULL;
int j=0;
while(s[j]==' '){
j++;
}
if (s[j]=='\0')
return "";
int i=0;
while(s[j]!='\0'){
while(s[j]==' ' && s[j] == s[j+1]) j++;
s[i++]=s[j++];
}
if(s[i-1]==' ')
s[--i]='\0';
else
s[i]='\0';
int len =i;
reverse(s,len);
i=j=0;
while(j<=len){
while(s[i]!=' ' && s[i]!='\0')i++;
tmp =i-j;
reverse(&s[j],tmp);
j=++i;
}
return s;
}