剑指 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:字符串的排列
46 0
|
6月前
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
39 0
图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
95 1
 图解LeetCode——剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
69 0
剑指 Offer 58 - I. 翻转单词顺序
leetcode剑指 offer58II左旋字符串
leetcode剑指 offer58II左旋字符串
53 0
|
Java 编译器 API
leetcode【字符串—简单】剑指 Offer 58.左旋转字符串
leetcode【字符串—简单】剑指 Offer 58.左旋转字符串
leetcode【字符串—简单】剑指 Offer 58.左旋转字符串
|
Java C++
LeetCode(剑指 Offer)- 33. 二叉搜索树的后序遍历序列
LeetCode(剑指 Offer)- 33. 二叉搜索树的后序遍历序列
116 0
LeetCode(剑指 Offer)- 33. 二叉搜索树的后序遍历序列
|
算法 Java Python
字符串——剑指 Offer 58 - II. 左旋转字符串
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
字符串——剑指 Offer 05. 替换空格
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助