代码随想录算法训练营第八天 | 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    }
目录
打赏
0
0
0
0
10
分享
相关文章
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
177 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
103 1
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
105 2
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
83 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
|
15天前
|
基于遗传优化算法的风力机位置布局matlab仿真
本项目基于遗传优化算法(GA)进行风力机位置布局的MATLAB仿真,旨在最大化风场发电效率。使用MATLAB2022A版本运行,核心代码通过迭代选择、交叉、变异等操作优化风力机布局。输出包括优化收敛曲线和最佳布局图。遗传算法模拟生物进化机制,通过初始化、选择、交叉、变异和精英保留等步骤,在复杂约束条件下找到最优布局方案,提升风场整体能源产出效率。
基于CS模型和CV模型的多目标协同滤波跟踪算法matlab仿真
本项目基于CS模型和CV模型的多目标协同滤波跟踪算法,旨在提高复杂场景下多个移动目标的跟踪精度和鲁棒性。通过融合目标间的关系和数据关联性,优化跟踪结果。程序在MATLAB2022A上运行,展示了真实轨迹与滤波轨迹的对比、位置及速度误差均值和均方误差等关键指标。核心代码包括对目标轨迹、速度及误差的详细绘图分析,验证了算法的有效性。该算法结合CS模型的初步聚类和CV模型的投票机制,增强了目标状态估计的准确性,尤其适用于遮挡、重叠和快速运动等复杂场景。

热门文章

最新文章