题目描述:


输入一个英文句子,翻句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a
student. “,则输出"student. a am I”。


剑指 Offer —— 58.翻转单词_剑指offer

实战大门​:​​题目链接

这到题在剑指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数组的原因,很容易造成堆栈,栈溢出问题,所以要谨慎细节。