No.1
题目
反转字符串
思路
代码
| public void reverseString(char[] s) { |
| char temp; |
| int left = 0, right = s.length - 1; |
| while (left < right) { |
| temp = s[left]; |
| s[left] = s[right]; |
| s[right] = temp; |
| left++; |
| right--; |
| } |
| } |
No.2
题目
反转字符串 II
思路
- 灵活使用
for
循环,每个step
是2k
- 理解
Math.min(s.length() - 1, start + k - 1)
,根据end
的位置不同做调整
- 换位置时候的start和end是左闭右闭区间
代码
| public String reverseStr(String s, int k) { |
| char[] copyS = s.toCharArray(); |
| for (int i = 0; i < s.length(); i += 2 * k) { |
| int start = i, end = Math.min(s.length() - 1, start + k - 1); |
| |
| while (start < end) { |
| char temp = copyS[start]; |
| copyS[start] = copyS[end]; |
| copyS[end] = temp; |
| |
| start++; |
| end--; |
| } |
| } |
| |
| return new String(copyS); |
| } |
No.3
题目
剑指 Offer 05. 替换空格
思路
代码
| public String replaceSpace(String s) { |
| StringBuilder sb = new StringBuilder(); |
| for (int i = 0; i < s.length(); i++) { |
| if (s.charAt(i) == ' ') |
| sb.append("%20"); |
| else |
| sb.append(s.charAt(i)); |
| } |
| return sb.toString(); |
| } |
No.4
题目
反转字符串中的单词
很考验字符串操作,实现比看起来要复杂得多
思路
- 不用内置函数做
- 移除首尾及中间多余空格
- 将整个字符串反转
- 将每个单词反转
代码
| public String reverseWords(String s) { |
| |
| StringBuilder sb = removeSpaces(s); |
| |
| |
| reverseString(sb, 0, sb.length() - 1); |
| |
| |
| reverseEachWord(sb); |
| |
| return sb.toString(); |
| } |
| |
| private StringBuilder removeSpaces(String str) { |
| int left = 0, right = str.length() - 1; |
| StringBuilder res = new StringBuilder(); |
| |
| |
| while (str.charAt(left) == ' ') left++; |
| while (str.charAt(right) == ' ') right--; |
| |
| while (left <= right) { |
| |
| if (str.charAt(left) != ' ' || res.charAt(res.length() - 1) != ' ') |
| res.append(str.charAt(left)); |
| left++; |
| } |
| |
| return res; |
| } |
| |
| private void reverseString(StringBuilder sb, int left, int right) { |
| while (left < right) { |
| char temp = sb.charAt(left); |
| sb.setCharAt(left, sb.charAt(right)); |
| sb.setCharAt(right, temp); |
| |
| left++; |
| right--; |
| } |
| } |
| |
| private void reverseEachWord(StringBuilder sb) { |
| int left = 0, right = left + 1; |
| |
| while (right < sb.length()) { |
| |
| while (right < sb.length() && sb.charAt(right) != ' ') right++; |
| reverseString(sb, left, right - 1); |
| |
| left = right + 1; |
| right = left + 1; |
| } |
| } |
No.5
题目
剑指 Offer 58 - II. 左旋转字符串
思路
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
代码
| public String reverseLeftWords(String s, int n) { |
| StringBuilder sb = new StringBuilder(s); |
| for (int i = 0; i < n; i++) { |
| char c = sb.charAt(0); |
| sb.deleteCharAt(0); |
| sb.append(c); |
| } |
| |
| return sb.toString(); |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理