代码随想录算法训练营第八天 | 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    }
相关文章
|
10天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
21天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
22 3
|
20天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
26天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
18 0
|
28天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
13天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
14天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
14天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
14天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
14天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
32 3