一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
前言
力扣第151题 颠倒字符串中的单词 如下所示:
一、思路
题目非常的长,我们简单总结以下:
- 输入的字符串
s会以空格分割开(可能会存在前导空格或者尾随空格) - 输出的结果为颠倒后的分割单词顺序
为了加深对题目的理解,我们以题目中的 s = "the sky is blue"作为例子。它是有the、sky、is、blue 这四个单词的,我们再颠倒一下,最终的结果就是 blue is sky the
综上所述,我们做两件事情就能够完成颠倒分割的单词。步骤如下:
- 忽略字符串中的空格(此处的忽略是指空格不会进入结果)
- 从字符串的后面开始取单词
滑动窗口
像上面的过程,我们就可以通过 滑动窗口 来分割单词,我们让滑动窗口从后面向前滑动。为了方便演示,我们此处使用 s = " is blue" 作为例子
黄色表示空格,绿色表示单词字符
- 窗口初始化,窗口左右均指向最后
left碰到单词字符就向左移动
left碰到空格就收集结果,再收紧窗口
收集结果:此时将 blue 加入到结果中
收紧窗口:将窗口 right 与 left 指向同一处
- 其它单词的收集过程同上
以上就是使用 滑动窗口 来颠倒字符串中单词的过程了。
二、实现
实现代码
实现代码与思路中保持一致
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");
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~