今日学习的文章链接和视频链接
自己看到题目的第一想法
#344.反转字符串
和反转链表相似,使用双指针法交换字符数组首尾元素即可。
#541. 反转字符串II
逻辑:双指针+for循环
先比较长度和k的关系,大于2k,则以2k为单位的for循环,不足的部分进行另一范围的呼唤操作。应该可以构造一个方法便于不同条件或逻辑下的调用。
#剑指Offer 05.替换空格
逻辑:双指针法
1.遍历字符串确定字符串s中空格数n
2.创建一个charp[] str2 = new char[str1.length() + 2 * n]
3.遍历字符串倒叙替换str2中的内容
4.返回新的字符串
#151.翻转字符串里的单词
逻辑:1 删除前后空格 2 遍历遇到空格进行区间界定,遍历并交换字符
#剑指Offer58-II.左旋转字符串
逻辑:判空判长、两次遍历赋值(差点实现出来)
看完代码随想录之后的想法
#344.反转字符串
印证了逻辑,数组使用细节不足。
#541. 反转字符串II
逻辑框架对,条件判断处理有误。文章给的判断条件很巧妙,循环判断条件和交换字符判断条件是两个逻辑,互不影响。
int end = Math.min(str.length, start + k - 1);
#剑指Offer 05.替换空格
逻辑相似,细节略有不同;
方法二简洁且丝滑,爱了爱了!
#151.翻转字符串里的单词
梳理逻辑:1 去除多余空格 2 反转整个字符串 3 反转每个单词字符串 4 返回结果
#剑指Offer58-II.左旋转字符串
梳理逻辑:和151逻辑相似:1 反转整个字符串 2 反转每个单词字符串
可以使用新的字符串,亦可以使用char型数组!!!决定元素交换方式。
自己实现过程中遇到哪些困难
#344.反转字符串
循环之后的索引处理:++ --;
基础补足:
1// 字符串转Char数组 2String str = "0,12,3"; 3char arr[]=str.toCharArray(); 4System.out.println(arr);//0,12,3 5注意这是输出的所有内容,不要理解成只将数字存到了数组,逗号是元素 System.out.println(Arrays.toString(arr)); // [0, ,, 1, 2, ,, 3] 6 7// 字符串转String数组 8String str = "0,12,3"; 9String arr[] = str.split("//,");
#541. 反转字符串II
几种条件下的不同实现细节甄别。其实是两个条件:一个以2k为单位循环遍历;一个判断要反转值的起始位置。
最后应该创建新字符串返回结果:return new String(str);
耐人寻味!!!
#剑指Offer 05.替换空格
判断逻辑不够严谨;比如,缺少:if (n == 0) { return s; }
数组边界处理,原数组和新数组遍历顺序应该保持一致性;
#151.翻转字符串里的单词
对字符串中间部分空格判空的处理很绕,不过搞懂了,两个有一个不为‘ ’即可赋值。相反,两者全为‘ ’,则直接start++进入下一层循环。
#剑指Offer58-II.左旋转字符串
字符串交换元素的方式和数组交换元素的方式区别。
今日收获,记录一下自己的学习时长
4.5h
#344.反转字符串
1//自己实现,存在问题:字符串及数组等基础知识较弱。 2class Solution { 3 public void reverseString(char[] s) { 4 // 第一想法:双指针交换首尾位置元素 5 6 int left = 0; 7 int right = s.length - 1; 8 while (left <= right) { 9 char temp = 'a'; 10 temp = s.char(left); 11 s.char(left) = s.char(right); 12 s.char(right) = temp; 13 } 14 return s; 15 } 16} 17// 修正 18class Solution { 19 public void reverseString(char[] s) { 20 // 第一想法:双指针交换首尾位置元素 21 22 int left = 0; 23 int right = s.length - 1; 24 while (left <= right) { 25 char temp = 'a'; 26 temp = s[left]; 27 s[left] = s[right]; 28 s[right] = temp; 29 left++; 30 right--; 31 } 32 33 } 34}
#541. 反转字符串II
1// 自己实现 2class Solution { 3 public String reverseStr(String s, int k) { 4 Char str = new str.toCharArray(); 5 6 for (int i = 0; i < str.length; i = 2k + 1) { 7 if (k > str.length) { 8 9 } 10 11 int left = 0; 12 int right = 2k; 13 while (left <= right) { 14 Char temp; 15 temp = str[left]; 16 str[left] = s[right]; 17 s[right] = temp; 18 left++; 19 right--; 20 } 21 } 22 return Arrays.toString(str); 23 24 } 25} 26// 修正了一遍 27class Solution { 28 public String reverseStr(String s, int k) { 29 char[] str = s.toCharArray(); 30 for (int i = 0; i < str.length; i += 2 * k) { 31 int start = 0; 32 // 条件判断:当小于k时,取str.length;当大于k时取start + k -1; 33 int end = Math.min(str.length, start + k - 1); 34 while (start < end) { 35 36 char temp = str[start]; 37 str[start] = str[end]; 38 str[end] = temp; 39 start++; 40 end--; 41 } 42 } 43 // return Arrays.toString(str); 44 return new String(str); 45 } 46}
#剑指Offer 05.替换空格
1class Solution { 2 public String replaceSpace(String s) { 3 // 1.判断字符串s中空格数n 4 char[] str1 = s.toCharArray(); 5 int n = 0; 6 for (int i = 0; i < str1.length; i++) { 7 if (str1[i] == ' ') { 8 n++; 9 } 10 } 11 12 // 2.创建一个charp[] str2 = new char[s.length() + 2n] 13 char[] str2 = new char[str1.length + 2 * n]; 14 // 3.遍历字符串倒叙替换str2中的内容 15 int j = str2.length; 16 for (int i = 0; i < str1.length; i++) { 17 18 if (str1[i] == ' ') { 19 str2[j--] = '0'; 20 str2[j--] = '2'; 21 str2[j--] = '%'; 22 } else { 23 str2[j--] = str1[i]; 24 } 25 } 26 // 4.返回新的字符串 27 return new String(str2); 28 } 29} 30 31// 代码随想录法一: 32class Solution { 33 public String replaceSpace(String s) { 34 if (s == null || s.length() == 0) { 35 return s; 36 } 37 38 // 遇到空格,扩充空间 39 StringBuilder str = new StringBuilder(); 40 for (int i = 0; i < s.length(); i++) { 41 if (s.charAt(i) == ' ') { 42 str.append(" "); 43 } 44 } 45 // 没有空格,直接返回s 46 if (str.length() == 0) { 47 return s; 48 } 49 50 // 有空格,定义双指针 51 int left = s.length() - 1; // 原字符串最后一位 52 s += str.toString(); 53 int right = s.length() - 1; 54 char[] chars = s.toCharArray(); 55 while (left >= 0) { 56 if(chars[left] == ' '){ 57 chars[right--] = '0'; 58 chars[right--] = '2'; 59 chars[right] = '%'; 60 }else{ 61 chars[right] = chars[left]; 62 } 63 left--; 64 right--; 65 } 66 return new String(chars); 67 68 } 69} 70// 代码随想录法二很丝滑: 71class Solution { 72 public String replaceSpace(String s) { 73 if (s == null || s.length() == 0) { 74 return s; 75 } 76 StringBuilder sb = new StringBuilder(); 77 78 for (int i = 0; i < s.length(); i++) { 79 if (s.charAt(i) == ' ') { 80 sb.append("%20"); 81 } else { 82 sb.append(s.charAt(i)); 83 } 84 } 85 return sb.toString(); 86 } 87}
#151.翻转字符串里的单词
1. 1// 自己实现:题意理解有误 2class Solution { 3 public String reverseWords(String s) { 4 // 1 删除前后多余空格 5 s = s.split(); 6 7 // 2 遍历反转空格间的字符串 8 for (int i = 0; i < s.length(); i++) { 9 while (s.charAt(i) == ' ') { 10 for (int j = 0; j < i; j++) { 11 String s1 = s.charAt(0); 12 s.charAt(0) = s.charAt(j); 13 s.charAt(j) = s1; 14 } 15 } 16 } 17 return s; 18 } 19} 20// 抄了一遍,梳理清了逻辑及实现细节。看明白就很开心~ 21class Solution { 22 public String reverseWords(String s) { 23 // 1 删除前后中间多余空格 24 StringBuilder sb = removeSpace(s); 25 26 // 2 反转整个字符串 27 reverseString(sb, 0, sb.length() - 1); 28 29 // 3 反转每个单词字符串 30 reverseEachWord(sb); 31 32 return sb.toString(); 33 } 34 public StringBuilder removeSpace(String s) { 35 int start = 0; 36 int end = s.length() - 1; 37 while (s.charAt(start) == ' ') { 38 start++; 39 } 40 while (s.charAt(end) == ' ') { 41 end--; 42 } 43 44 // 中间去空逻辑 45 StringBuilder sb = new StringBuilder(); 46 while (start <= end) { 47 // 同时为空时,则去空不加入!!! 48 if (s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' ') { 49 sb.append(s.charAt(start)); 50 } 51 start++; 52 } 53 return sb; 54 55 } 56 57 public void reverseString(StringBuilder sb, int start, int end) { 58 while (start < end) { 59 char temp = sb.charAt(start); 60 sb.setCharAt(start, sb.charAt(end)); 61 sb.setCharAt(end, temp); 62 start++; 63 end--; 64 } 65 } 66 67 public void reverseEachWord(StringBuilder sb) { 68 int start = 0; 69 int end = 1; 70 int n = sb.length(); 71 while (start < n) { 72 while (end < n && sb.charAt(end) != ' ') { 73 end++; 74 } 75 reverseString(sb, start, end - 1); 76 start = end + 1; 77 end = start + 1; 78 } 79 } 80}
#剑指Offer58-II.左旋转字符串
1// 自己实现 2class Solution { 3 public String reverseLeftWords(String s, int n) { 4 StringBuilder sb = new StringBuilder(); 5 if (s == null || s.length() ==0) { 6 return s; 7 } 8 if (s.length() < n) { 9 return s; 10 } 11 int m = 0; 12 for (int i = n; i < s.length(); i++) { 13 sb.charAt(m) = s.charAt(n); 14 m++; 15 } 16 int l = s.length() - n; 17 for (int i = 0; i < n; i++) { 18 sb.charAt(l) = s.charAt(i); 19 l++; 20 } 21 return s; 22 } 23} 24// 代码随想录看文章自己实现之后又修改的。 25class Solution { 26 public String reverseLeftWords(String s, int n) { 27 28 StringBuilder sb = new StringBuilder(s); 29 30 // 分别反转前后两部分字符串 31 reverseString(sb, 0, n - 1); 32 reverseString(sb, n, s.length() - 1); 33 34 return sb.reverse().toString(); 35 36 37 } 38 // 新函数的定义方式 39 public void reverseString(StringBuilder sb, int start, int end) { 40 // 字符串的交换方式?? 41 while (start < end) { 42 // char temp = sb.charAt(start); 43 // sb.CharAt(start) = sb.charAt(end); 44 // sb.charAt(end) = temp; 45 46 char temp = sb.charAt(start); 47 sb.setCharAt(start, sb.charAt(end)); 48 sb.setCharAt(end, temp); 49 50 start++; 51 end--; 52 } 53 } 54} 55 56// 逻辑整体性和151相同,字符数组实现交换 57class Solution { 58 public String reverseLeftWords(String s, int n) { 59 char[] str = s.toCharArray(); 60 61 reverseString(str, 0, str.length - 1); 62 reverseString(str, 0, n - 1); 63 reverseString(str, n, str.length - 1); 64 65 // return Arrays.toString(str); 66 return new String(str); 67 68 } 69 public void reverseString(char[] str, int start, int end) { 70 while (start < end) { 71 char temp = str[start]; 72 str[start] = str[end]; 73 str[end] = temp; 74 start++; 75 end--; 76 } 77 }