浅谈AI刷题的优势|豆包MarsCode AI刷题

71 阅读5分钟

AI刷题简介


在刷题的时候,我们阅读完题目之后到写完答案提交成功这一过程可分为审题、思考、输出代码。这一整个过程,AI都可以参与其中。

审题阶段

当我们遇到比较冗长的题目,我们第一时间无法抓到题目的重点。但是因为在日常刷题中,我们需要更快速地进入对问题的思考,避免长时间的读题目浪费时间。这个时候我们可以让AI帮我们总结问题。

我们可以像AI提问:“请帮我归纳题目”、“请帮我总结问题” 等话语

例如 中等题 57题 最大相等分割红包金额

问题描述

小U在公司年会上运气极佳,赢得了一等奖。作为一等奖得主,他有机会在一排红包中做两次切割,将红包分成三部分,要求第一部分和第三部分的红包总金额相等。他可以获得的金额是第一部分红包的总金额。帮小U计算出他能从这些红包中拿到的最大奖金金额。

image.png

困难题 UCC字串计算

问题描述

小S有一个由字符 'U' 和 'C' 组成的字符串 SS,并希望在编辑距离不超过给定值 mm 的条件下,尽可能多地在字符串中找到 "UCC" 子串。

编辑距离定义为将字符串 SS 转化为其他字符串时所需的最少编辑操作次数。允许的每次编辑操作是插入、删除或替换单个字符。你需要计算在给定的编辑距离限制 mm 下,能够包含最多 "UCC" 子串的字符串可能包含多少个这样的子串。

例如,对于字符串"UCUUCCCCC"和编辑距离限制m = 3,可以通过编辑字符串生成最多包含3个"UCC"子串的序列。

image.png

思考

我们在审题后,基本上对题目的意思清楚了。简单而言就是,给定我们什么东西(数组、变量等等),需要我们做出什么样的结果(输出)。
那么假设我们理解了题目的意思,但是没有头绪,比如用什么数据结构,用什么样的算法,并且暴力求解、暴力模拟非常复杂。我们仍然可以问AI。

最大相等分割红包金额

我们可以问AI:这道题的思路是什么?

好的,让我们来逐步分析这个问题,并提供一些思路提示。

问题理解

我们需要将红包列表分成三部分,使得第一部分和第三部分的总金额相等,并且计算出第一部分的最大总金额。

数据结构选择

  1. 前缀和数组:用于快速计算任意子数组的和。
  2. 双指针:用于在数组中寻找合适的切割点。

算法步骤

  1. 计算前缀和:首先计算红包列表的前缀和数组,这样可以快速计算任意子数组的和。
  2. 双指针遍历:使用双指针从两端向中间遍历,寻找合适的切割点。
  3. 比较和调整:在遍历过程中,比较第一部分和第三部分的总金额,如果相等则记录当前的最大值,如果不相等则调整指针位置。

具体步骤

  1. 初始化前缀和数组

    • 计算前缀和数组 prefixSum,其中 prefixSum[i] 表示从 redpacks[0] 到 redpacks[i] 的总和。
  2. 双指针遍历

    • 使用两个指针 i 和 j,分别从数组的两端开始。
    • 计算当前 i 和 j 位置的前缀和,即 leftSum = prefixSum[i] 和 rightSum = prefixSum[n-1] - prefixSum[j-1]
    • 如果 leftSum 等于 rightSum,则更新最大值 max
    • 如果 leftSum 大于 rightSum,则移动 j 指针向左。
    • 如果 leftSum 小于 rightSum,则移动 i 指针向右。
  3. 返回最大值

    • 最终返回 max,即第一部分的最大总金额。

注意

  • 在遍历过程中,确保 i 和 j 之间的距离足够大,以保证至少有一个红包在中间部分。

希望这些思路提示对你有所帮助!如果你有任何具体的问题或需要进一步的解释,请告诉我。

这样我们就知道了用什么样的思路解题,有效避免暴力求解百思不得求解浪费的刷题时间。

输出代码

根据给定的思路,我们开始正式写代码,如果仍然不知道代码如何写,我们可以让AI给出完整的代码或者代码提示。(偶尔我们需要自己改进代码,因为AI也会出错),通过我们的改进,我们可以输出正确的代码。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(List<Integer> redpacks) {
        // Please write your code here
        int n = redpacks.size();
        int i = 0, j = n - 1;
        int max = 0;
        while (i < j) {
            int left = 0;
            int right = 0;
            for (int k = 0; k <= i; k++) {
                left += redpacks.get(k);
            }
            for (int k = n - 1; k >= j; k--) {
                right += redpacks.get(k);
            }
            if (left == right) {
                max = Math.max(max, right);
                i++;
                j--;
            } else if (left > right) {
                j--;
            } else {
                i++;
            }
        }

        return max;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        List<Integer> redpacks1 = new ArrayList<>();
        redpacks1.add(1);
        redpacks1.add(3);
        redpacks1.add(4);
        redpacks1.add(6);
        redpacks1.add(7);
        redpacks1.add(14);

        List<Integer> redpacks2 = new ArrayList<>();
        redpacks2.add(10000);

        List<Integer> redpacks3 = new ArrayList<>();
        redpacks3.add(52);
        redpacks3.add(13);
        redpacks3.add(61);
        redpacks3.add(64);
        redpacks3.add(42);
        redpacks3.add(26);
        redpacks3.add(4);
        redpacks3.add(27);
        redpacks3.add(25);

        List<Integer> redpacks4 = new ArrayList<>();
        redpacks4.add(2);
        redpacks4.add(5);
        redpacks4.add(50);
        redpacks4.add(30);
        redpacks4.add(60);
        redpacks4.add(52);
        redpacks4.add(26);
        redpacks4.add(5);
        redpacks4.add(74);
        redpacks4.add(83);
        redpacks4.add(34);
        redpacks4.add(96);
        redpacks4.add(6);
        redpacks4.add(88);
        redpacks4.add(94);
        redpacks4.add(80);
        redpacks4.add(64);
        redpacks4.add(22);
        redpacks4.add(97);
        redpacks4.add(47);
        redpacks4.add(46);
        redpacks4.add(25);
        redpacks4.add(24);
        redpacks4.add(43);
        redpacks4.add(76);
        redpacks4.add(24);
        redpacks4.add(2);
        redpacks4.add(42);
        redpacks4.add(51);
        redpacks4.add(96);
        redpacks4.add(97);
        redpacks4.add(87);
        redpacks4.add(47);
        redpacks4.add(93);
        redpacks4.add(11);
        redpacks4.add(98);
        redpacks4.add(41);
        redpacks4.add(54);
        redpacks4.add(18);
        redpacks4.add(16);
        redpacks4.add(11);
        redpacks4.add(96);
        redpacks4.add(34);
        redpacks4.add(36);
        redpacks4.add(87);
        redpacks4.add(24);
        redpacks4.add(32);
        redpacks4.add(27);
        redpacks4.add(62);
        redpacks4.add(72);
        redpacks4.add(54);
        redpacks4.add(14);
        redpacks4.add(67);
        redpacks4.add(5);
        redpacks4.add(21);
        redpacks4.add(20);
        redpacks4.add(44);
        redpacks4.add(55);
        redpacks4.add(3);
        redpacks4.add(82);
        redpacks4.add(19);
        redpacks4.add(45);
        redpacks4.add(1);
        redpacks4.add(52);
        redpacks4.add(14);
        redpacks4.add(44);
        redpacks4.add(46);
        redpacks4.add(39);
        redpacks4.add(83);
        redpacks4.add(27);
        redpacks4.add(30);
        redpacks4.add(87);
        redpacks4.add(61);
        redpacks4.add(56);
        redpacks4.add(59);
        redpacks4.add(10);
        redpacks4.add(83);
        redpacks4.add(80);
        redpacks4.add(42);
        redpacks4.add(44);
        redpacks4.add(75);
        redpacks4.add(39);
        redpacks4.add(43);
        redpacks4.add(41);
        redpacks4.add(23);
        redpacks4.add(93);
        redpacks4.add(73);
        redpacks4.add(50);
        redpacks4.add(94);
        redpacks4.add(94);
        redpacks4.add(82);
        redpacks4.add(46);
        redpacks4.add(87);
        redpacks4.add(60);
        redpacks4.add(94);
        redpacks4.add(47);
        redpacks4.add(52);
        redpacks4.add(67);
        redpacks4.add(22);
        redpacks4.add(50);
        redpacks4.add(49);
        redpacks4.add(8);
        redpacks4.add(9);
        redpacks4.add(30);
        redpacks4.add(62);
        redpacks4.add(87);
        redpacks4.add(13);
        redpacks4.add(11);

        System.out.println(solution(redpacks1) == 14);
        System.out.println(solution(redpacks2) == 0);
        System.out.println(solution(redpacks3) == 52);
        System.out.println(solution(redpacks4) == 2627);
    }
}

总结

拥有豆包AI辅助刷题,可以帮助我们有效节省刷题时间、快捷方便、短时间能掌握多道算法题不是梦