给定一个字符串,逐个翻转字符串中的每个单词。
示例 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;
}