字典序最小字符串调整 | 豆包MarsCode AI 刷题

99 阅读4分钟

学习方法与心得

在刷题过程中,我选择了一种“思考 + 实践 + 总结”的学习方法。借助豆包MarsCode AI刷题平台,不仅能快速选择高质量题目,还可以查看AI给出的提示和解决思路。这种方法让我更注重题目本质的理解,而非仅仅完成答案的输出。
心得是:刷题的目的是提升自己的逻辑和解决问题能力,关键在于拆解问题、优化思路,并能总结可迁移的解决方案。


题目解析

本次解析的是一个字典序调整问题,目标是通过不超过k次相邻字符交换,使字符串字典序最小。这题不仅考察贪心算法的思路,还需要一定的模拟实现能力。

题目描述

给定一个仅由01组成的字符串,可以最多进行k次相邻字符交换。最终输出字典序最小的字符串。

题目思路
  1. 核心分析

    • 每次操作只能交换相邻字符,因此将0移动到左侧需要付出一定的交换代价。
    • 优化的重点是尽可能减少交换次数,逐步将0“推动”到前面,而不是暴力尝试所有可能的交换。
  2. 贪心策略

    • 每遇到一个0,将其向左移动,直到不能再移动为止。
    • 在移动过程中,必须关注剩余交换次数,确保不会超过k的限制。
  3. 算法步骤

    • 遍历字符串,找到0的位置。
    • 每个0逐步向左移动,直到遇到无法交换的情况(即左边是0或交换次数用尽)。
图解

例如输入n=5, k=2, s="01010"

初始:     0 1 0 1 0
步骤10 0 1 1 0   (第一步交换:0向左移动1次)
步骤20 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"));
    }
}
  • 关键点

    1. 每次遇到0,都尽可能多地进行交换,将其往左移动。
    2. remainingSwaps用来记录剩余可用的交换次数,避免超出k限制。
    3. 输出结果需要在每次操作后保存并返回最终的调整结果。

知识总结

通过这道题,我强化了以下几点知识:

  1. 贪心算法
    贪心的本质是每一步都选择局部最优解,使全局结果最优。这题中的贪心策略是将0尽量往前移动。

  2. 模拟操作
    模拟过程需要精准还原字符交换,同时通过变量remainingSwaps来限制操作次数。这种题型常用于考察代码实现的细节能力。

  3. 字符串优化技巧

    • 将字符串转为数组处理,减少字符串操作的复杂度。
    • 遍历、条件判断和局部交换的结合运用。
学习建议
  • 入门同学可以从简单的贪心题开始练习,比如“跳跃游戏”或“分发饼干”。
  • 刷题时先独立思考,实在无思路再借助AI工具提示。

学习计划

结合豆包MarsCode AI的刷题功能,我总结了一套高效学习计划:

  1. 阶段性目标

    • 每周选取一个算法主题(如贪心、动态规划),完成相应题库中的10~15道题。
    • 每天至少完成1~2道题,并对错题进行深度复盘。
  2. 错题整理与优化

    • 将错题归类,记录解题过程中遇到的难点。
    • 结合AI提供的提示,重新编写代码,直到完全掌握思路。
  3. 难题突破

    • 遇到复杂题目时,拆解为多个小问题,逐一解决。
    • 利用豆包MarsCode的“代码讲解”功能,分析他人的解决方案。

工具运用

豆包MarsCode AI不仅提供了多样化的题目,还能针对不同的解题阶段提供实用工具:

  1. 快速生成思路
    对于完全没有头绪的题目,使用AI生成提示,帮助打破思维瓶颈。

  2. 代码评测与优化
    在平台运行代码,可以实时获取反馈,并根据优化建议改进代码。

  3. 结合其他学习资源

    • 将AI刷题与经典书籍(如《算法导论》)相结合,理论与实践并重。
    • 利用在线社区(如LeetCode讨论区),参考高赞解答并与自己的思路对比。

总结

通过豆包MarsCode AI刷题,我不仅掌握了贪心算法的核心思想,还在解决问题的过程中培养了代码优化能力。未来,我会继续利用豆包MarsCode刷题工具,逐步完成各类算法题型的训练,同时借助错题复盘和学习计划,进一步提升自己的编程实力!