java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 这道题,可以理解为,将字符串颠倒,但是每个单词原来的顺序是什么还是什么,不能改变单词的组合顺序,比如apple,able这个例子,字符串颠倒后为able,apple。整个字符串顺序颠倒了,但是apple和able这两个单词本身,不可以变化。
  2. 难点在于,每个单词中间的空格个数是不确定的,我们无法直接用split()等方法,直接按照空格为分隔符,将字符串分隔开来。会分隔出很多空字符串。
  3. 所以我们不以单个单词这样一个字符串作为单位进行反转,而是把整个字符串,转换为字符数组,进行判断
  1. 首先转换为字符数组: [ , , h, e, l, l, o, , w, o, r, l, d, , ]可以看到这个例子,有很多空字符串
  2. 然后我们先从左向右找到第一个非空字符[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  3. 然后继续向左找到第一个空格[ , , h, e, l, l, o,空格, w, o, r, l, d, , ]
  4. 此时我们就找到了第一个单词的左右下标[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  5. 将其插入新的数组中[w, o, r, l, d, , ],这样就完成了第一个单词的反转工作,也就是将最后一个单词放到第一个位置,然后单词不进行变化
  6. 然后重复上面的步骤,直到所有单词处理完成
代码

在这里插入图片描述

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();//获取字符数组
        char[] newArr = new char[s.length()+1];//保存反转字符串的数组
        int index = 0;//newArr的下标,代表插入位置
        int i = s.length()-1;//我们从后往前遍历,将后面的元素,依次插入到newArr的前面,就实现了反转
        while(i >= 0){//只要还有元素可以遍历就继续
            while(i >= 0 && arr[i] == ' ') i--;//向左找到第一个非空格字符
            int right = i;//让right指向它,代表它是当前单词的最后一个字母位置
            while(i >= 0 && arr[i] != ' ') i--;//继续向左找第一个空格A
            for(int j = i + 1; j <= right; j++){//那么这个A空格,右边第一个字符,就是这个单词的起始位置
                newArr[index++] = arr[j];//将这个单词插入newArr
                if(j == right){//如果插入完成
                    newArr[index++] = ' ';//补上一个空格,分隔开来
                }
            }
        }
        if(index == 0){//如果没插入过字母,就返回空串
            return "";
        }
        return new String(newArr, 0, index-1);//返回答案
    }
}
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值