1. 题目
题目
考查点
这个算法题的考查点是:
- 字符串的处理,如去除空格,分割单词,拼接字符串等。
- 双指针的使用,如左右指针,单词边界指针等。
- 字符串的反转,如整体反转,局部反转等。
2. 解法
思路
这个代码的思路是先去除字符串首尾的空格,然后反转整个字符串,再反转每个单词。这样就可以实现将每个单词逐个翻转的效果。
例如,给定字符串 “the sky is blue”,
- 经过去除空格后得到 “the sky is blue”,
- 反转整个字符串后得到 “eulb si yks eht”,
- 再反转每个单词后得到 “blue is sky the”,就是最终的结果。
代码的思路。这个代码可以分为三个步骤:
- 去除字符串首尾的空格,使得字符串只包含有效的单词和单词之间的空格。
- 反转整个字符串,使得每个单词的顺序颠倒,但是每个单词内部的字符顺序不变。
- 反转每个单词,使得每个单词内部的字符顺序也颠倒,从而实现将每个单词逐个翻转的效果。
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public String reverseWords(String s) { s = s.trim(); // 去除首尾空格 StringBuilder sb = new StringBuilder(); // 用于存储结果 for ( int i = 0 ; i < s.length(); i++) { if (s.charAt(i) == ' ' && sb.length() > 0 && sb.charAt(sb.length() - 1 ) == ' ' ) { continue ; // 跳过多余的空格 } else { sb.append(s.charAt(i)); // 添加字符到结果 } } int left = 0 ; // 左指针 int right = sb.length() - 1 ; // 右指针 while (left < right) { char tmp = sb.charAt(left); // 交换左右字符 sb.setCharAt(left, sb.charAt(right)); sb.setCharAt(right, tmp); left++; // 移动左指针 right--; // 移动右指针 } int boundary = 0 ; // 单词边界指针 while (boundary < sb.length()) { left = boundary; // 左指针指向单词开头 while (boundary < sb.length() && sb.charAt(boundary) != ' ' ) { boundary++; // 移动边界指针到单词结尾 } right = boundary - 1 ; // 右指针指向单词结尾 while (left < right) { char tmp = sb.charAt(left); // 交换左右字符 sb.setCharAt(left, sb.charAt(right)); sb.setCharAt(right, tmp); left++; // 移动左指针 right--; // 移动右指针 } boundary++; // 移动边界指针到下一个单词开头 } return sb.toString(); // 返回结果字符串 } |
3. 总结
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2021-04-28 深入JVM关闭与关闭钩子
2021-04-28 ShutdownHook - Java 优雅停机解决方案
2021-04-28 RocketMQ性能优化
2021-04-28 RocketMQ调优心得总结
2021-04-28 RocketMQ性能优化【实战笔记】
2021-04-28 RocketMQ在面试中那些常见问题及答案+汇总
2019-04-28 24种设计模式的通俗理解