掘金刷题之路 Day 15 | 豆包MarsCode AI刷题

131 阅读5分钟

刷题实践与解题策略

在学习编程和算法的过程中,刷题是提升技能的一个重要方式。借助 AI 刷题平台,我们可以高效地进行练习,通过精选真题、云端编辑器、个性化题目推荐等功能,不断提高自己的编程能力。而在刷题过程中,我们也会遇到各种类型的题目,例如本题:通过相邻字符交换使字符串字典序最小,这类问题不仅考察了算法思维,还锻炼了对贪心策略和操作优化的理解。

本文将结合我的刷题实践,分析如何通过 AI 刷题平台的辅助功能,有效解决类似的题目。


问题分析

题目描述: 给定一个由 01 组成的字符串,小U可以进行最多 k 次相邻字符交换,每次操作交换相邻的两个字符。目标是通过这些操作,将字符串调整为字典序最小的字符串。

目标: 我们需要尽可能将字符串中的 0 移动到前面,以最小化字典序,并且操作次数不能超过 k


解题思路

  1. 贪心策略

    • 每次我们都尝试将当前字符串中尽可能靠前的 0 移到前面。如果一个 0 可以通过交换操作被移动到前面,并且我们还有足够的操作次数(k 次),就将它移过去。
  2. 操作限制

    • 每次交换只能交换相邻的字符,因此在操作过程中需要注意,每次移动 0 时消耗的操作次数。如果当前位置的 0 和目标位置之间的距离大于 k,就不能直接交换到目标位置。
  3. 交换过程

    • 对于每个 0,我们从左到右遍历,并且尽量将它移动到当前位置之前的最前面,最多进行 k 次操作。

解决步骤

  1. 遍历字符串

    • 从左到右遍历字符串,找到每个 0,对于每个 1,尝试将后面最靠近的 0 移动到当前 1 之前。
  2. 检查能否交换

    • 对于每个 1,从它的后面开始查找第一个出现的 0,计算将这个 0 移动到当前位置的所需交换次数。如果 k 次操作足够,就执行交换并更新剩余的 k 次操作。
  3. 交换并更新

    • 执行相邻字符交换操作,并减少剩余的 k,直到不能再做交换为止。

代码实现

public class Main {
    public static String solution(int n, int k, String s) {
        // 将字符串转换为字符数组以方便操作
        char[] arr = s.toCharArray();
        
        // 从左到右遍历字符数组
        for (int i = 0; i < n && k > 0; i++) {
            if (arr[i] == '0') {
                continue;  // 当前字符是 '0',跳过
            }
            
            // 查找接下来最靠前的 '0'
            for (int j = i + 1; j < n; j++) {
                if (arr[j] == '0') {
                    // 计算需要交换的次数
                    int neededMoves = j - i;
                    if (neededMoves <= k) {
                        // 交换位置
                        for (int l = j; l > i; l--) {
                            // 交换相邻的两个字符
                            char temp = arr[l];
                            arr[l] = arr[l - 1];
                            arr[l - 1] = temp;
                        }
                        // 更新剩余的操作次数
                        k -= neededMoves;
                    }
                    break;  // 只处理第一个找到的 '0'
                }
            }
        }
        
        // 将字符数组转回字符串并返回
        return new String(arr);
    }

    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. 遍历字符串:我们从左到右遍历字符串,对于每个 1,寻找后面最靠近的 0,并计算将其移到当前 1 之前所需的交换次数。如果剩余的操作次数足够,就进行交换。
  2. 交换操作:通过交换相邻字符,逐步将 0 移动到最前面,并更新剩余的操作次数。
  3. 最终结果:经过一系列交换后,返回字典序最小的字符串。

复杂度分析:

  • 时间复杂度O(n * n),在最坏情况下,我们需要遍历每个字符,并且每次可能会进行交换操作。这意味着对于每个字符,我们可能需要遍历剩余的字符,导致最坏情况下的时间复杂度为 O(n^2)
  • 空间复杂度O(n),我们需要使用额外的数组来存储字符串的字符,以便进行交换操作。

刷题实践与 AI 刷题平台的结合

AI 刷题平台的作用: 在刷题过程中,AI 刷题平台提供了多种智能化的功能来帮助我们高效学习。例如:

  • 精选真题:平台提供大量来自真实面试的题目,帮助我们熟悉面试题型和算法要求。在练习类似的问题时,可以借助平台提供的真题,逐步解决更加复杂的问题,提升自己的编程水平。
  • 云端编辑器:通过平台提供的云端编辑器,学生可以随时在线编写和调试代码,无需在本地环境中进行配置。这种方式节省了配置开发环境的时间,让我们能更集中精力进行题目练习。
  • 个性化推荐:AI 刷题平台根据我们的刷题记录,推荐最适合的题目,帮助我们有针对性地提升自己的弱项,避免无谓的重复练习。

刷题实践中的收获: 在使用 AI 刷题平台进行练习时,我发现平台推荐的个性化题目帮助我逐步攻克了字符串处理和贪心算法相关的难题。在解决字典序最小字符串问题时,平台不仅提供了丰富的题库,还能通过智能提示、即时反馈等功能,帮助我快速理解问题本质,并找到最优解法。

通过不断练习类似的算法题,我的编程思维得到了锻炼,也提升了解题速度和准确性,为将来面对实际面试和编程竞赛时打下了坚实的基础。