学习方法与心得
在刷题过程中,我选择了一种“思考 + 实践 + 总结”的学习方法。借助豆包MarsCode AI刷题平台,不仅能快速选择高质量题目,还可以查看AI给出的提示和解决思路。这种方法让我更注重题目本质的理解,而非仅仅完成答案的输出。
心得是:刷题的目的是提升自己的逻辑和解决问题能力,关键在于拆解问题、优化思路,并能总结可迁移的解决方案。
题目解析
本次解析的是一个字典序调整问题,目标是通过不超过k次相邻字符交换,使字符串字典序最小。这题不仅考察贪心算法的思路,还需要一定的模拟实现能力。
题目描述
给定一个仅由0和1组成的字符串,可以最多进行k次相邻字符交换。最终输出字典序最小的字符串。
题目思路
-
核心分析
- 每次操作只能交换相邻字符,因此将
0移动到左侧需要付出一定的交换代价。 - 优化的重点是尽可能减少交换次数,逐步将
0“推动”到前面,而不是暴力尝试所有可能的交换。
- 每次操作只能交换相邻字符,因此将
-
贪心策略
- 每遇到一个
0,将其向左移动,直到不能再移动为止。 - 在移动过程中,必须关注
剩余交换次数,确保不会超过k的限制。
- 每遇到一个
-
算法步骤
- 遍历字符串,找到
0的位置。 - 每个
0逐步向左移动,直到遇到无法交换的情况(即左边是0或交换次数用尽)。
- 遍历字符串,找到
图解
例如输入n=5, k=2, s="01010":
初始: 0 1 0 1 0
步骤1: 0 0 1 1 0 (第一步交换:0向左移动1次)
步骤2: 0 0 1 0 1 (第二步交换:0再向左移动1次)
最终: 0 0 1 0 1
代码详解
public class Main {
public static String solution(int n, int k, String s) {
char[] chars = s.toCharArray();
int remainingSwaps = k;
for (int i = 0; i < n && remainingSwaps > 0; i++) {
if (chars[i] == '0') {
int pos = i;
while (pos > 0 && chars[pos - 1] == '1' && remainingSwaps > 0) {
chars[pos] = '1';
chars[pos - 1] = '0';
pos--;
remainingSwaps--;
}
}
}
return new String(chars);
}
public static void main(String[] args) {
System.out.println(solution(5, 2, "01010").equals("00101"));
System.out.println(solution(7, 3, "1101001").equals("0110101"));
System.out.println(solution(4, 1, "1001").equals("0101"));
}
}
-
关键点:
- 每次遇到
0,都尽可能多地进行交换,将其往左移动。 remainingSwaps用来记录剩余可用的交换次数,避免超出k限制。- 输出结果需要在每次操作后保存并返回最终的调整结果。
- 每次遇到
知识总结
通过这道题,我强化了以下几点知识:
-
贪心算法
贪心的本质是每一步都选择局部最优解,使全局结果最优。这题中的贪心策略是将0尽量往前移动。 -
模拟操作
模拟过程需要精准还原字符交换,同时通过变量remainingSwaps来限制操作次数。这种题型常用于考察代码实现的细节能力。 -
字符串优化技巧
- 将字符串转为数组处理,减少字符串操作的复杂度。
- 遍历、条件判断和局部交换的结合运用。
学习建议
- 入门同学可以从简单的贪心题开始练习,比如“跳跃游戏”或“分发饼干”。
- 刷题时先独立思考,实在无思路再借助AI工具提示。
学习计划
结合豆包MarsCode AI的刷题功能,我总结了一套高效学习计划:
-
阶段性目标
- 每周选取一个算法主题(如贪心、动态规划),完成相应题库中的10~15道题。
- 每天至少完成1~2道题,并对错题进行深度复盘。
-
错题整理与优化
- 将错题归类,记录解题过程中遇到的难点。
- 结合AI提供的提示,重新编写代码,直到完全掌握思路。
-
难题突破
- 遇到复杂题目时,拆解为多个小问题,逐一解决。
- 利用豆包MarsCode的“代码讲解”功能,分析他人的解决方案。
工具运用
豆包MarsCode AI不仅提供了多样化的题目,还能针对不同的解题阶段提供实用工具:
-
快速生成思路
对于完全没有头绪的题目,使用AI生成提示,帮助打破思维瓶颈。 -
代码评测与优化
在平台运行代码,可以实时获取反馈,并根据优化建议改进代码。 -
结合其他学习资源
- 将AI刷题与经典书籍(如《算法导论》)相结合,理论与实践并重。
- 利用在线社区(如LeetCode讨论区),参考高赞解答并与自己的思路对比。
总结
通过豆包MarsCode AI刷题,我不仅掌握了贪心算法的核心思想,还在解决问题的过程中培养了代码优化能力。未来,我会继续利用豆包MarsCode刷题工具,逐步完成各类算法题型的训练,同时借助错题复盘和学习计划,进一步提升自己的编程实力!