代码随想录算法训练营第八天 | 344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串

今日学习的文章链接和视频链接

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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值