代码随想录算法训练营第八天【字符串】344.反转字符串、541.反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
344.反转字符串
心得:关键在于定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
class Solution { public void reverseString(char[] s) { int i = 0; int j = s.length-1; while(i<j){ char temp = s[i]; s[i] = s[j]; s[j] = temp; i++; j--; } } }
541.反转字符串II
心得:重点是在遍历字符串的过程中,让 i 每次移动 2*k。
class Solution { public String reverseStr(String s, int k) { char[] chars = s.toCharArray(); int len = chars.length; for(int i=0;i<len;i+=2*k){ int j = Math.min(chars.length-1,i+k-1); reverse(chars,i,j); } return new String(chars); } void reverse(char[] chars,int i,int j){ while(i<j){ char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; i++; j--; } } }
剑指Offer 05.替换空格
心得:创建了一个StringBuilder对象,没凸显出算法的部门。周末再试一下双指针的思路。
class Solution { public String replaceSpace(String s) { StringBuilder st = new StringBuilder(); if(s == null){ return s; } for(int i =0;i<s.length();i++){ if(s.charAt(i) == ' '){ st.append("%20"); }else{ st.append(s.charAt(i)); } } return st.toString(); } }
151.翻转字符串里的单词
心得:
1)移除多余空格
2)将整个字符串反转
3)将每个单词反转
class Solution { public String reverseWords(String s) { StringBuilder sb = removeSpace(s); reverseString(sb, 0, sb.length() - 1); reverseEachWord(sb); return sb.toString(); } StringBuilder removeSpace(String s){ int start = 0; int end = s.length() - 1; while (s.charAt(start) == ' ') start++; while (s.charAt(end) == ' ') end--; StringBuilder sb = new StringBuilder(); while (start <= end) { char c = s.charAt(start); if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { sb.append(c); } start++; } return sb; } void reverseString(StringBuilder sb, int start, int end){ while (start < end) { char temp = sb.charAt(start); sb.setCharAt(start, sb.charAt(end)); sb.setCharAt(end, temp); start++; end--; } } private void reverseEachWord(StringBuilder sb) { int start = 0; int end = 1; int n = sb.length(); while (start < n) { while (end < n && sb.charAt(end) != ' ') { end++; } reverseString(sb, start, end - 1); start = end + 1; end = start + 1; } } }
剑指Offer58-II.左旋转字符串
心得:思路很重要。反转区间为前n的子串,反转区间为n到末尾的子串,反转整个字符串。
1)String转为数组,char[] chars = s.toCharArray()
2)数组转为String,String.copyValueOf(chars),或者,new String(ch)
class Solution { public String reverseLeftWords(String s, int n) { char[] chars = s.toCharArray(); reverse(chars,0,n-1); reverse(chars,n,chars.length-1); reverse(chars,0,chars.length-1); return String.copyValueOf(chars); } void reverse(char[] chars,int i,int j){ while(i<j){ char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; i++; j--; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?