题目链接
这题还不算难;
思路:从后往前遍历字符串,若不为空,则将字符储存到临时数组stack中,一旦遇到空格,则将临时数组中的元素赋值给最终数组stack1。
细节代码中有解释。
char * reverseWords(char * s){
int len=strlen(s);
char *stack=(char *)malloc((len+1)*sizeof(char));
char *stack1=(char *)malloc((len+1)*sizeof(char));
int i=0,j=0,flag=0,m=0,n=0,count=0;
if(len==0){//若字符串为"",则返回""
return"";
}
while(s[i]==' '){//若字符串全为空格,返回""
count++;
i++;
}
if(count==len)return "";
for(i=len-1;i>=0;i--){
if(s[i]!=' '){
stack[m]=s[i];
m++;
flag=1;
}
if(s[i]==' '){
while(m>0 && flag==1){
m--;//m要先减一,因为在处理一个单词的最后一个字母后,m又加了一。
stack1[n]=stack[m];
n++;
}
if(flag==1){
stack1[n]=' ';
n++;
}
flag=0;//清除标记位,当遍历完字母后有多个空格,flag==0,则不会对多余空格处理。
}
}
if(m!=0){//当stack[m]=s[i]到字符串最后时,t=t-1=0-1=-1,无法再进入循环,要单独处理
while(m>0){
m--;
stack1[n]=stack[m];
n++;
}
}
if(stack1[n-1]==' '){//最后一个单词末尾是有空格的,但题目条件是翻转后最后一个字母不为空格。
n=n-1;
}
stack1[n]='\0';
return stack1;
}