剑指 Offer —— 58.翻转单词

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

image.png

实战大门题目链接

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

相关文章
|
6月前
剑指 Offer 38:字符串的排列
剑指 Offer 38:字符串的排列
48 0
|
6月前
剑指 Offer 50:第一个只出现一次的字符
剑指 Offer 50:第一个只出现一次的字符
36 0
|
6月前
|
C++
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
42 0
|
6月前
剑指 Offer 29:顺时针打印矩阵
剑指 Offer 29:顺时针打印矩阵
38 0
图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
96 1
 图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
72 0
剑指 Offer 58 - I. 翻转单词顺序
|
存储
图解LeetCode——剑指 Offer 50. 第一个只出现一次的字符
图解LeetCode——剑指 Offer 50. 第一个只出现一次的字符
74 0
【LeetCode】-- 剑指 Offer 42. 连续子数组的最大和
【LeetCode】-- 剑指 Offer 42. 连续子数组的最大和
【LeetCode】-- 剑指 Offer 42. 连续子数组的最大和