• 作者:老汪软件技巧
  • 发表时间:2024-11-05 10:01
  • 浏览量:

如何高效学习算法 | 豆包MarsCode AI刷题

这是我在掘金的第一篇文章,作为一名数据结构与算法能力较弱的同学,我不得不说,豆包MarsCode AI刷题给予了我的比较大的帮助,接下来我以一道算法题为例:找出最长的神奇数列

题目如下问题描述

小明是一个中学生,今天他刚刚学习了数列。他在纸上写了一个长度为n的正整数序列,a0,a1,…,an−1a0​,a1​,…,an−1​。这个数列里面只有 1 和 0,我们将 1 和 0 没有重复跟随并且至少由 3 个数组成的数列的数列称之为「神奇数列」。比如10101是一个神奇数列,1011不是一个神奇数列。他想知道这个序列里面最长的「神奇数列」是哪个,你可以帮帮他吗?

输入格式输出格式输入样例

0101011101

输出样例

010101

数据范围

这只是一道简单题,可能对于一些算法实力较强的同学来说,在短时间内完成这道题并没有任何难度,甚至轻松地有些许随意,但对我来说,任何一道算法题都是一次挑战,无论它的难度标签是简单、中等还是困难,在短时间内我完全没有一点办法解决,平时在其他地方刷题时,总是需要看到题解中的讲解才有些许思路,然后一行解释一行代码的翻来覆去一一对照着理解,消化吸收也总是需要一遍又一遍不断地看题解中的代码,偶尔无法理解解析也只能硬着头皮去想,然后第二次遇到相似问题的时候又会依照着自己已有的并不是那么好的思路继续解题,看到题解的那一刻又突然恍然大悟“噢噢噢!我上次在那道题里也是用的这个思路”,虽说在长时间和大量的刷题下,能慢慢掌握一些题目的解题思路,但花费的时间也确实很多。

然而这次我接触到了豆包MarsCode AI刷题,一开始看到这道题的时候思路很多,却感觉始终差一点,抓不到其中的窍门,一个一个的思路就像是一条条滑溜溜的鱼,每当我试图抓住它们的小尾巴,总是会从我的手里溜走。按照往常我只能不断地想、不断地想,找题解学习解题思路。但我却发现,豆包MarCode AI刷题工具的逻辑却是截然不同的,在看过它给我提示的解题思路后,我试着按照它的思路逐步实现代码,写码途中一些疑惑和思路不通畅的地方也可以随时向它提问,这不仅大大提高了我学习解题思路的效率,在学习思路的过程中,在它提供的思路基础上也不断地完善我自己的思路,使得我的学习效率事半功倍。

不仅如此,在沿着思路完成代码的编写后,代码未通过测试用例也可以继续向它提问。即使代码通过了全部测试用例,我也依然将我的代码交给了豆包AI进行优化,一些代码不规范,思路不严谨的地方,豆包AI也都向我进行了详细解释,让我受益匪浅。

可以这样说,豆包AI不仅大大提高了学习算法的效率,锻炼了我接算法题的思维能力,也让我写的代码更为规范,逻辑更为严谨。豆包MArsCode AI刷题,我愿称之为弱算法同学学习算法锻炼思维能力的神兵利器!!!

下面附上我使用豆包AI学习解题的部分截图

如何高效的刷算法题__刷题算法总结

使用豆包AI进行思路提示

{01DB6B29-5EB0-4B3E-BA46-053840C89FDA}.png

豆包AI提供的思路以及代码框架提示

{F1332496-8AA6-4A04-955A-D7E2459EF05F}.png

对豆包AI提供思路的疑惑解答

{0A761987-5D0E-4FDB-B865-38D56A9B5E47}.png

豆包AI优化我的代码并给出解释

{D071FAF0-A5C3-495A-A743-99AB35CF8E85}.png

最后附上我按照豆包AI提供的思路的详细代码和其优化版本

原始代码

public class Main {
    public static String solution(String inp) {
        // Edit your code here
        int maxLen = 0;
        int currLen = 0;
        char lastChar = inp.charAt(0);
        int maxStartIndex = 0;
        int currentStartIndex = 0;
        for (int i = 0; i < inp.length(); i++) {
            char currentChar = inp.charAt(i);
            if (currentChar != lastChar) {
                currLen++;
                if (currLen >= 3 && currLen > maxLen) {
                    maxLen = currLen;
                    maxStartIndex = currentStartIndex;
                }
            } else {
                currLen = 1;
                currentStartIndex = i;
            }
            lastChar = currentChar;
        }
        return inp.substring(maxStartIndex, maxStartIndex + maxLen);
    }
    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution("0101011101").equals("010101"));
    }
}

优化版本

public class Main {
    public static String solution(String inp) {
        int maxLen = 0;
        int currLen = 1;
        char lastChar = inp.charAt(0);
        int maxStartIndex = 0;
        int currentStartIndex = 0;
        for (int i = 1; i < inp.length(); i++) {
            char currentChar = inp.charAt(i);
            if (currentChar != lastChar) {
                currLen++;
            } else {
                if (currLen >= 3 && currLen > maxLen) {
                    maxLen = currLen;
                    maxStartIndex = currentStartIndex;
                }
                currLen = 1;
                currentStartIndex = i;
            }
            lastChar = currentChar;
        }
        // 处理最后一个子序列
        if (currLen >= 3 && currLen > maxLen) {
            maxLen = currLen;
            maxStartIndex = currentStartIndex;
        }
        return inp.substring(maxStartIndex, maxStartIndex + maxLen);
    }
    public static void main(String[] args) {
        System.out.println(solution("0101011101").equals("010101"));
    }
}