青训营X豆包MarsCode 技术训练营第四课 | 豆包MarsCode AI 刷题

32 阅读3分钟

关于AI刷题的使用体验

我今天要记录的是在我最初使用豆包AI进行刷题时遇到的一个题目, 我并没有一开始就使用 AI提供思路或者代码,自己经过思考过后在草稿纸上画出了每一个测试样例的常规计算过程,类似于蛮力求解,因为我确实没什么思路。然后我在画图的过程中,总觉得前进一步,再后退一步,这种具有倒退过程的算法题目,可能会需要用到递归思想,或者是动态规划的结构,但是对于动态规划我学得还不够深,所以选择了顺着推,找到规律后用递归的思想来理解这道题。这是当时我写的代码:

public class Main
{
public static int route(int position, int yPosition, int i, int step, int p[]) {
    /* 总是以加法靠近yPosition,i 递增,总能满足相差为 1 的条件*/
    while (position < yPosition) {
        i++;
        position = position + i;
        step++;
    }
    // 退出循环的条件
    if (position == yPosition && i == 1)
        return step;
    //不满足条件则退回上一步,每次退回都要记录
    else {
        position = position - i;
        p[step - 1]++;
    }
    //如果当前步数的三条分支还未走完,则递减 i,继续走下一条分支
    if (p[step - 1] < 3) {
        i--;
        position = position + i;
        return route(position, yPosition, i, step, p);
    } 
    //如果三条分支都走完,则退回前2步,p记录此次探索,覆盖上一次的记录
    else {
        position = position - (i + 1);
        step -= 2;
        p[step]++;
        p[step + 1] = 0;
        return route(position, yPosition, --i, step, p);    //注意i 递减
    }
   }
public static int solution(int xPosition, int yPosition) 
{
//全局变量数组p,用作记录当前步数上已经走过的分支个数
    int p[] = new int[100]; 
    if (xPosition < yPosition) {
        return route(xPosition, yPosition, 0, 0, p);
    } 
    //如果 x>y,交换 xy
    else {
        int a;
        a = xPosition;
        xPosition = yPosition;
        yPosition = a;
        return route(xPosition, yPosition, 0, 0, p);
    }
}

public static void main(String[] args) {
    System.out.println(solution(12, 6) == 4);
    System.out.println(solution(34, 45) == 6);
    System.out.println(solution(50, 30) == 8);
} 
}

可以看出我当时用了非常繁琐的步骤来解答这道题,大量地使用了循环,而且是试探性地总结了前面几个测试的规律,运行成功后,在提交时却始终无法通过,修改了数组容量后,出现了结果完全不对的情况。

说实话,这个时候我已经不想再做这道题了,因为前面的递归逻辑对我来说已经有点绕了。就在我准备放弃的时候,想起来还有 AI 工具可以使用,并且我相信豆包的训练数据是有部分是来源于其他使用者,他们当中一定有人能给出正确代码。抱着这样尝试的心态,我点击了“给我一些代码提示”,AI迅速出来了一段简洁而完整的代码,比我的代码简洁太多了,并且成功通过了所有测试案例,以下是它的核心代码片段:

public static int solution(int xPosition, int yPosition) 

  {
    if (xPosition == yPosition) {
        return 0;
    }
    
    int distance = Math.abs(yPosition - xPosition);
    int sqrtDistance = (int) Math.sqrt(distance);

    if (sqrtDistance * sqrtDistance == distance) {
        return 2 * sqrtDistance - 1;
    } else if (distance <= sqrtDistance * (sqrtDistance + 1)) {
        return 2 * sqrtDistance;
    } else {
        return 2 * sqrtDistance + 1;
    }
}

所以原来从数学的角度,就可以轻易找到本题的规律,并且能够直接给出公式,分几个类别,套用不同的公式就可以解题,没有那么多逻辑的思考,甚至也不需要用到任何数据结构。

看到这段代码后,我虽然有种前面的时间都浪费了的感觉,但也从这次刷题中明白确实在陷入焦灼的时候,要学会善于借助 AI工具来解决问题,只靠自己的想法,可能会陷入死胡同,导致问题的解决变得越来越困难。