今日学习的文章链接和视频链接
https://programmercarl.com/%E5%89%91%E6%8C%87Offer58-II.%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html
自己看到题目的第一想法
#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// 自己实现:题意理解有误
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 }
78}