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

简介: 代码随想录算法训练营第八天 | 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. 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    }
相关文章
|
6天前
|
算法 搜索推荐 程序员
第六十五练 字符串匹配 - Rabin-Karp算法
第六十五练 字符串匹配 - Rabin-Karp算法
8 1
|
6天前
|
算法 搜索推荐 程序员
第六十四练 字符串匹配 - Boyer-Moore算法
第六十四练 字符串匹配 - Boyer-Moore算法
9 0
|
6天前
|
算法 搜索推荐 程序员
第六十三练 字符串匹配 - KMP算法
第六十三练 字符串匹配 - KMP算法
8 2
|
6天前
|
算法 C语言 人工智能
|
6天前
|
机器学习/深度学习 算法 API
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
9 0
|
6天前
|
算法 关系型数据库 C语言
卡尔曼滤波简介+ 算法实现代码(转)
卡尔曼滤波简介+ 算法实现代码(转)
20 4
|
6天前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
21 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
4天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。