1. 翻转字符串里的单词
    给定一个字符串,逐个翻转字符串中的每个单词。

说明:

无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

示例 1:

输入:“the sky is blue”
输出:“blue is sky the”
示例 2:

输入:" hello world! "
输出:“world! hello”
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入:“a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 4:

输入:s = " Bob Loves Alice "
输出:“Alice Loves Bob”
示例 5:

输入:s = “Alice does not even like bob”
输出:“bob like even not does Alice”

提示:

1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ’ ’
s 中 至少存在一个 单词

思路分析:
题意已经非常明确,就是让我们反转字符串里面的单次,只不过有些条件:

1.如果字符串前面和后面有空格,全部去掉
2.中间多余的空格也去掉

很多同学可能会有一个疑惑该怎么转,如果把整个字符串反转了,那单词的顺序也不对呀,其实我们只需要将反转完成的字符串里面的单词,再次反转就行,就相当于把第一次反转完成的字符串里,在根据条件反转里面的子字符串。

本题思路:

1.去除前面、后面和中间多余的空格

在这里我们可以使用双指针法,left和right,分别指向头部和尾部,如果是空格left++ ,right–;(我们在这里假设y为空,不想重新作图)

关键问题我们如何去除中间多余的空格:
我们定义一个StringBuilder sb(因为他拼接的速度快)将去除前面和后面空格的字符串s从做到右拷贝到sb中,当s.charAt(left)不为空,我们将这个字符拷贝过去,如果为空,我们要判断上一次传入的字符是否为空,若为空跳过,不为加入到sb;

当left指针走到空格的时候判断上一个字符为k不为空,所以将空存入sb,然后left++

之后继续右走,重复以上步骤

java代码:

public StringBuilder removeSpace(String s) {int left = 0 , right = s.length() - 1;//移除开头的空格while (left <= right && s.charAt(left) == ' ') {left++;}//移除结尾的空格while (left <= right && s.charAt(right) == ' ') {right--;}StringBuilder sb = new StringBuilder();//移除中间多余的空格while (left <= right) {char c = s.charAt(left) ;if (c != ' ') {sb.append(c);}else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}left++;}return sb;}

2.反转字符串

这个是最基础的算法了,如果有不清楚的同学,可以查看https://blog.csdn.net/qq_43413774/article/details/115082618
Java代码:

public void reverse(StringBuilder sb , int left , int right) {while (left < right) {char temp = sb.charAt(left);sb.setCharAt(left++ , sb.charAt(right));sb.setCharAt(right-- , temp);}} 

3.反转单词

就是将字符串里面被反转的单词分离开,分别进行反转

判断条件就是当遇到空格的时候分离开,并进行反转
java代码:

public void reverseEachWord(StringBuilder sb) {int n = sb.length();int start = 0 , end = 0;while (start < n) {while (end < n && sb.charAt(end) != ' ') {end++;}reverse(sb , start , end - 1);start = end + 1;end++;}}

本题思路并不难,但是就是代码逻辑性比较强,先反转还是先去空格其实都一样,甚至你都可以先反转单词,除非你闲的没事干,给自己找麻烦。

完整代码:

class Solution {public String reverseWords(String s) {//去除空格StringBuilder newString = removeSpace(s);//反转所有字符串reverse(newString , 0 , newString.length() - 1);//反转每个单次reverseEachWord(newString);return newString.toString();}public StringBuilder removeSpace(String s) {int left = 0 , right = s.length() - 1;//移除开头的空格while (left <= right && s.charAt(left) == ' ') {left++;}//移除结尾的空格while (left <= right && s.charAt(right) == ' ') {right--;}StringBuilder sb = new StringBuilder();//移除中间多余的空格while (left <= right) {char c = s.charAt(left) ;if (c != ' ') {sb.append(c);}else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}left++;}return sb;}public void reverse(StringBuilder sb , int left , int right) {while (left < right) {char temp = sb.charAt(left);sb.setCharAt(left++ , sb.charAt(right));sb.setCharAt(right-- , temp);}} public void reverseEachWord(StringBuilder sb) {int n = sb.length();int start = 0 , end = 0;//边界,循环终止条件while (start < n) {//while (end < n && sb.charAt(end) != ' ') {end++;}//当遇到空字符时,执行以下代码reverse(sb , start , end - 1);start = end + 1;end++;}}

其实此题也可以用库函数做出来,就那么几行代码,不过不建议使用,因为大部分人不知道他们是如何实现的,就比如正则表达式,有人甚至没听过。

class Solution {public String reverseWords(String s) {// 除去开头和末尾的空白字符s = s.trim();// 正则匹配连续的空白字符作为分隔符分割List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ", wordList);}
}

若有误,请指教!

反转字符串里的单词 + 图示相关推荐

  1. 151. 反转字符串里的单词

    151. 反转字符串里的单词 方法一:不使用Java内置方法实现 class Solution {public String reverseWords(String s) {//1.去除首尾以及中间多 ...

  2. Day8——反转字符串、反转字符串||、替换空格、反转字符串里的单词、左旋字符串

    今天是算法训练的第八天. 目录 前言 一.反转字符串 解题思路: 二.反转字符串|| 题目描述: 解题思路: 三.替换空格 解题思路: 四.反转字符串中的单词 解题思路: 五.左旋转字符串 解题思路: ...

  3. C++实现反转字符串里的单词

    文章目录 0 问题描述 1 方法一 2 方法二 3 方法三 0 问题描述 给定一个字符串,逐个翻转字符串中的每个单词. 示例: 输入: "the sky is blue", 输出: ...

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

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

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

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

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

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

  7. python单词反转_翻转字符串里的单词

    翻转字符串里的单词 题目要求 给定一个字符串,逐个翻转字符串中的每个单 示例: 输入: " the sky is blue", 输出: "blue is sky the ...

  8. python【力扣LeetCode算法题库】151- 翻转字符串里的单词

    翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the&quo ...

  9. 数组翻转_LeetCode刷题实战151:翻转字符串里的单词

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !今天和大家聊 ...

最新文章

  1. Maxout激活函数
  2. 教程-Delphi编译就报毒
  3. JavaScript PHP模仿C#中string.format效果
  4. c语言实现辗除法,辗除法什么东西哦?
  5. (转载)Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
  6. python股票交易模型_如何用Python建模GGM模型并对股票估值?
  7. 【ESSD技术解读-01】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?
  8. 信号与系统sa函数求积分_瞎扯数学分析微积分(1~4)
  9. python更新_MacOS升级python版本
  10. 开源joda-time使用demo
  11. 内置炊具行业调研报告 - 市场现状分析与发展前景预测
  12. 电商智能写作:京东AI闪电智能写作引擎
  13. c#绝对值函数图像_图像处理评价指标之模糊度、清晰度(待更新)
  14. IntelliJ IDEA使用技巧(二)——添加jar包
  15. paip.XXListener is already configured监听器已经被配置的解决
  16. Android设备研发术语表
  17. VIVADO 下载mcs 文件
  18. 在CentOS 8上安装使用Firefox的视频播放功能(FFmpeg)
  19. 新版个人信息安全规范正式发布:收集生物识别信息前需告知
  20. Delta3D(6)教程:创建游戏角色-2

热门文章

  1. 在position absolute div 怎么居中
  2. line.strip()是什么意思
  3. NVIDIA显卡算力查询
  4. 【开源项目】之仓鼠管家和OpenHamtaro
  5. 【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托
  6. 走进C++程序世界---------雇员工资管理系统
  7. 癞蛤蟆与天鹅的爱情故事--天空16度蓝
  8. (附源码)计算机毕业设计SSM课堂考勤
  9. 科技新品 | TCL平板电脑等亮相IFA 2020;华为首推方形智能手表;卡西欧新款G-SHOCK可互换表圈表带...
  10. bim在建筑工程中的应用有哪些?