实战大门:题目链接
这到题在剑指Offer里身价从中等降到了简单,可见这Offer不是那么简单搞到的,如题目要要求,需要反序反序输出语句,但是单词本身顺序不变。
源码分析👏
char* reverseWords(char* s){ int len = strlen(s); char* arr =(char*) malloc(sizeof(char)* (len+1)); char* brr =(char*)malloc(sizeof(char)*(len+1)); int a = 0; int b = len-1; int c = 0; while(b>=0) //逆序遍历 { while((b>=0)&&*(s+b)!=' ') //逐个找出单词 { *(brr+a)=*(s+b); //将找到的单词存进brr数组中 a++; b--; } a--; if(c > 0) { *(arr+c) = ' '; c++; //计数空格 } while(a>=0) { *(arr+c)=*(brr+a); a--; c++; } //将brr数组信息转到数组arr中 a=0; while(b>=0&&*(s+b)==' ') //移除s的空格 { b--; } } *(arr+c)='\0'; //添加结束标志 free(brr); //释放数组brr return arr; }
这里我们的基本思路依然采用双指针,malloc时多一位保证空间足够,我们既然要逆序输出就直接逆序读取,强调一下C语言对空间的要求十分敏感,这也是后面释放brr数组的原因,很容易造成堆栈,栈溢出问题,所以要谨慎细节。