借助侧栏AI,从零开始,敲敲代码写写题 | 豆包MarsCode AI刷题

77 阅读6分钟

----以下是一些可有可无的废话----

不怕大家笑话,我在写题库里的Java题目时,甚至还不会Java

对,我对Java地认识仅限于这四个字母。

尽管久仰Java大名,但是我并没有真正上手实操的经验,当下仅仅知道的,只有python那点相较其他语言十分浅薄的语法。

(当然,有的人会说,那你为甚要选Java,选python不好吗?有两个原因,一是刚开始的时候,用python无法判题,那相比另一个语言,我会觉得学Java性价比更高。其次是据说Java就业面广一点?这我不太了解,但应该是这样的,总之比python更接地气)

但是,我完全不慌!

为什么?

首先有 “全知全能救苦救难观世音AI” 打辅助,只要追根究底地问下去,总能有所收获,体味到第一手最纯正的编程味道;

其次,我还没有蠢到连AI的话都理解不了的地步!(除非AI又在一本正经地胡说八道。。。而这并非我的错)

FAKE IT UNTIL YOU MAKE IT !

这是我的牢记脑中的格言,学习从来没有“万事俱备”,最好的办法就是勇敢面对它!

在实践中学习,又在学习中实践,加油,奥里给!

----以上是一些无关紧要的絮叨----

借助侧栏AI,从零开始,敲敲代码写写题

可以了解的内容有:

  • 用侧栏AI辅助,写代码题的全过程

  • 我是怎么调整话术,使得AI可以理解并解答我的疑问的

  • 一道说不上有什么启发的编程题的解法

好的,让我们正式开始吧!

首先来看看题目:

图片.png

问题描述

小C面临一个选择问题:她可以从编号为1到n的糖果中任意选择一些糖果作为奖励,但需要遵守一个限制规则:如果选择了编号为i的糖果,那么编号为i-1、i-2、i+1、i+2的糖果将不能被选择。每个糖果都有一个对应的美味值,小C希望所选糖果的美味值之和最大。

例如:当有7个糖果,编号为1到7,美味值分别为 3, 1, 2, 7, 10, 2, 4,小C可以选择编号为1、4、7的糖果,这样可以得到最大美味值之和为 3 + 7 + 4 = 14

第一轮对话

1.png

我在我的零基础视角再小小总结一下:

  1. 问题描述:你需要从编号为1到n的糖果中选择一些糖果,使得它们的美味值之和最大。选择时不能选择连续的三个糖果。

  2. 算法步骤

    • 初始化:创建一个数组dp,其中dp[i]表示选择第i个糖果时能获得的最大美味值。
    • 状态转移:对于每个糖果i,有两种情况:
      • 选择第i个糖果,那么dp[i] = a[i] + dp[i-3](因为i-1i-2不能选)。
      • 不选择第i个糖果,那么dp[i] = dp[i-1]
    • 状态转移方程为:dp[i] = Math.max(a[i] + dp[i-3], dp[i-1])
    • 边界条件:当i < 3时,dp[i]可以直接初始化为a[i],因为前面没有足够的糖果来影响选择。
    • 最终结果dp[n-1]即为所求的最大美味值之和。
  3. 代码实现

    • 首先检查糖果数量是否小于等于2,如果是,直接返回最大值。
    • 初始化dp数组的前三个元素。
    • 使用循环填充dp数组,根据状态转移方程计算每个位置的最大美味值。
    • 返回dp[n-1]作为结果。
  4. 关键步骤

    • 初始化dp[0], dp[1], dp[2]
    • 状态转移:dp[i] = Math.max(a[i] + dp[i-3], dp[i-1])
    • 返回结果:dp[n-1]

很好,但是有个很严重的问题,就是我并不十分了解什么是“动态规划”,更是对其怎么使用一窍不通!

怎么办,只能继续问问AI。

2.png

到现在,我基本了解了动态规划的用法了。

为什么选择动态规划,在这道题里面怎么来使用,AI讲的很清楚:

动态规划,一般就是拿来解决最优解的问题!

当然,我只是浅尝辄止了一下,要真正掌握还得深入代码里面,一句句理解琢磨。

AI在这个过程中,也能发挥巨大的作用:

当然AI给的初步的代码不一定正确,可以复制粘贴到答题区,用判题系统先行检验一次,或者也可以让AI自己检查一遍自己,我更喜欢后面这种方法。

我先把经过初步检验的、AI给的代码放在这里:

    public static int solution(int n, int[] a) {
        if (n == 1) {
            return a[0];
        }
        if (n == 2) {
            return Math.max(a[0], a[1]);
        }

        int[] dp = new int[n + 1];
        dp[0] = 0; // 初始化 dp[0]
        dp[1] = a[0];
        dp[2] = Math.max(a[0], a[1]);
        dp[3] = Math.max(dp[2], a[2]);

        for (int i = 4; i <= n; i++) {
            // 考虑 i-1, i-2, i+1, i+2 的限制
            dp[i] = Math.max(dp[i - 1], a[i - 1] + dp[i - 3]);
            // 这里需要添加额外的逻辑来处理 i+1 和 i+2 的限制
        }

        return dp[n];
    }

    public static void main(String[] args) {
        System.out.println(solution(7, new int[]{3, 1, 2, 7, 10, 2, 4}) == 14);
        System.out.println(solution(5, new int[]{1, 10, 2, 5, 8}) == 18);
        System.out.println(solution(6, new int[]{4, 5, 6, 1, 2, 3}) == 9);
    }
}

然后,我让AI来逐行解释代码,以期让我充分了解里面的实现细节:

3.png

至此,我们完全理解了整个题目的解决思路,也基本掌握了动态规划的思想,初步了解了该方法什么时候用、怎么用,以及语义分析、语法规则等等。

当然还要持续的学习、上手才能真正掌握!

这里仅仅作为使用AI辅助解决编程题的草率演示!

几点感想

  1. 跟一些先进同行相比,marscode的水平还是不高,经常出错。而且反复讲车轱辘话,没能抓住重点解释;
  2. 像这种AI辅助编程好用吗?我觉得是好用的,但前提是你自己也得有基础,这又是一个有点矛盾的事情了。我只是写一道算法题,似乎能理解AI,但是在实际生产生活中,AI的话,你未必能理解,若是理解不了,知其然而不知其所以然,那就极有可能是在瞎用。
  3. AI辅助编程学习是目前最实用的方向,因为AI能精确地知道你的疑问所在(只要你表述清楚)

OK,就是这些,peace!下篇文章见!