如题:

给定一个字符串,逐个翻转字符串中的每个单词。示例 1:
输入: "the sky is blue"
输出: "blue is sky the"示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

这道题在数组专项练习遇到过,第一反应就是简单,没多想,上去就是撸代码,结果考虑边界用时N分钟,晕了过去。

回过头仔细思考了下,这道题逻辑不难,但是边界处理部分很重要,稍有不慎就会出错,尤其是c语言。

方案大概有三种:

方法1:从后往前逐个拷贝单词到另一个数组中,需要使用额外数组空间N。
方法2:像镜像一样,先反转整个字符串,然后逐个反转每个单词,最后去除头部空格,中间空格以及尾部空格。此方案优点是空间复杂度低。

方法3:使用栈,从后往前将单词入栈,然后顺序出栈即可,同方法1一样,需要使用额外辅助空间。

题目进阶要求c语言使用O(1)复杂度,方案2可满足要求。三种方案都不复杂,但是代码实现还是很能考验水平,建议多练。

下面是方案2 镜像反转的c代码实现:


/**  特殊情况:参数为空或者长度小于1*  方法1:从后往前逐个拷贝单词到另一个数组*  方法2:反转整个字符串,然后反转每个单词*  方法3: 从后往前应该使用栈*/void swap(char *a,  char *b)
{*a = *a ^ *b;*b = *a ^ *b;*a = *a ^ *b;
}void reverseWord(char *s, int first, int end)
{if (first == end)return;while(first < end)swap(s+(first++), s+(end--));return;
}char * reverseWords(char * s){int i, j, first, last,len,c;char *p, clast;//参数为空或者长度为0返回if (!s || strlen(s) < 1)return s;//反转字符串len = strlen(s);for (i = 0, j = len - 1; i < j;){if (s[i] != s[j])swap(s+(i++), s+(j--));else{i++; j--;}   }//反转每个单词last = first = 0;while (1){while(first < len && s[first] == ' ')first++;             if (first >= len)break;else{last = first;while(last < len && s[last] != ' ')last++;reverseWord(s, first, last - 1);}if (last >= len)break;first = last;}printf("%s\n", s);//去除开头空格i = 0;while(i < len && s[i] == ' '){len--;s++;}   if (len < 0)return s;//删除多余空格for (i = 0, j = 0, c = 0; i < len-1; i++){while (i < len - 1 && s[i] == ' ' && s[i] == s[i+1]){c++; i++;}if (c && i < len - 1 && s[i+1] != ' '){i++;while(i < len && s[i] != ' '){swap(s+i-c, s+i);i++;}i--;}}//去除末尾空格len = strlen(s);while(len > 0 && s[len-1] == ' '){s[len-1] = '\0';len--;}return s;
}

=============================================================================================

Linux应用程序、内核、驱动开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

leetcode 151. 翻转字符串里的单词 c代码 三种方案相关推荐

  1. [leetcode]151.翻转字符串里的单词

    给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔开. 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串. ...

  2. leetcode 151. 翻转字符串里的单词

    难度:中等 频次:69 题目: 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔开. 请你返回一个翻转 s 中单 ...

  3. LeetCode 151. 翻转字符串里的单词(栈)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1:输入: "the sky is blue" 输出: "blu ...

  4. 72.编辑距离105.前序中序遍历序列构造二叉树151.翻转字符串里的单词104.二叉树的最大深度76.最小覆盖子串110.平衡二叉树31.下一个排列

    72.编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符. ...

  5. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  6. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  7. 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

    LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...

  8. LeetCode 186. 翻转字符串里的单词 II

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串,逐个翻转字符串中的每个单词. 示例: 输入: ["t","h","e",&qu ...

  9. 力扣151. 翻转字符串里的单词

    给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔开. 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串. ...

最新文章

  1. 使用 SqlHelperParameterCache 类管理参数
  2. POJ-2159(Water)
  3. Python ConfigParser 模块
  4. IO流基础,创建File对象与方法是用
  5. vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题
  6. bcrypt如何内置盐?
  7. Windows Phone 7 学习笔记1:Hello, Windows Phone 7
  8. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器启用https服务申请免费证书...
  9. spring boot 使用maven和fat jar/war运行应用程序的对比
  10. altera fpga sdi输出方案_高段位攻城狮是这样解决SI分析、DDR、FPGA国产化问题的! | 电巢直播答疑汇总...
  11. UML之一综合设计例题
  12. 百度网盘海外版上传下载不限速;一季度北京平均月薪达11187元;苹果 CEO 增加新候选人|极客头条...
  13. python学习---字符串
  14. 匹配区县代码_行政区划代码查询
  15. 关于美图秀秀的flash在线版
  16. Gmail服务器拒绝发送邮件,向Gmail发送邮件被退信,其他均正常,请协助,谢谢大家...
  17. 2022 面试必刷 461 道大厂架构面试真题汇总 + 面经 + 简历模板
  18. 关于手机天气应用中的城市搜索的联想查找方式优化
  19. 80和443端口的区别
  20. Android 系统应用-通信应用-MCC、MNC和IMSI的介绍以及运营商标识码对应表

热门文章

  1. 今天被编码搞惨了,页面和脚本的编码一致性
  2. GARFIELD@11-21-2004
  3. centos 并发请求数_Linux Shell多进程并发以及并发数控制
  4. matlab中的方波信号图片_电气信息类专业课程之matlab系统仿真 第十章 DBPSK调制解调器(9)...
  5. git 移动分支指针_git 分支( branch ) 的基本使用
  6. 6.6 二分 K-Means 算法-机器学习笔记-斯坦福吴恩达教授
  7. STM32 基础系列教程 35 - Lwip_sntp
  8. 远距离蓝牙四驱小车方案
  9. 【方案】0615冰箱运行监测系统资料整理:进展及规划
  10. 【PC工具】在线格式转换工具,视频格式转换,视频转gif工具