力扣第151题-颠倒字符串中的单词

192 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

前言

力扣第151题 颠倒字符串中的单词 如下所示:

image.png

一、思路

题目非常的长,我们简单总结以下:

  • 输入的字符串 s 会以空格 分割开(可能会存在前导空格或者尾随空格)
  • 输出的结果为颠倒后的分割单词顺序

为了加深对题目的理解,我们以题目中的 s = "the sky is blue"作为例子。它是有theskyisblue 这四个单词的,我们再颠倒一下,最终的结果就是 blue is sky the

综上所述,我们做两件事情就能够完成颠倒分割的单词。步骤如下:

  1. 忽略字符串中的空格(此处的忽略是指空格不会进入结果)
  2. 从字符串的后面开始取单词

滑动窗口

像上面的过程,我们就可以通过 滑动窗口 来分割单词,我们让滑动窗口从后面向前滑动。为了方便演示,我们此处使用 s = " is blue" 作为例子

黄色表示空格,绿色表示单词字符

image.png

  1. 窗口初始化,窗口左右均指向最后

image.png

  1. left 碰到单词字符就向左移动

image.png

  1. left 碰到空格就收集结果,再收紧窗口

收集结果:此时将 blue 加入到结果中

image.png

收紧窗口:将窗口 rightleft 指向同一处

image.png

  1. 其它单词的收集过程同上

以上就是使用 滑动窗口 来颠倒字符串中单词的过程了。

二、实现

实现代码

实现代码与思路中保持一致

public String reverseWords(String s) {
    StringBuilder ret = new StringBuilder();
    char[] arr = s.toCharArray();
    int len = arr.length;
    int right = len -1;
    int left = len -1;
    while (left > -1){
        char c = arr[left];
        if (c == ' '){
            // 看看有没有需要保存的
            if (left != right){
                ret.append(" ").append(s, left + 1, right + 1);
            }
            left--;
            right = left;
        } else {
            left--;
        }
    }
    // 最后可能有漏的
    if (left != right){
        ret.append(" ").append(s, left + 1, right + 1);
    }
    return ret.substring(1);
}

测试代码

public static void main(String[] args) {
    new Number151().reverseWords("the sky is blue");

}

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~