01串最小化操作问题 | 豆包MarsCodeAI刷题

56 阅读3分钟

我今天利用豆包的AI刷题功能写了一道名称为01串最小化操作问题的题目。

下面为题目描述

小M得到了一个只包含字符 '0' 和 '1' 的字符串,她想通过一系列操作将字符串中的所有字符都变成相同的字符。每次操作中,她可以选择两个相邻的字符,将它们同时变为 '0' 或同时变为 '1'。 请你帮助小M计算出,最少需要进行多少次操作,才能使得字符串中的所有字符都相同。

我的思路是分别求出来将需要操作的字符串全部变成0和全部变成1所需要的次数,然后再将两个结果的最小值返回。下面是我的具体代码:

public static int solution(String s) {
    byte[] b1 = s.getBytes();
    int sum1 = 0;
    for(int i = 0;i<s.length();i++){
        if(b1[i]=='0'){
            b1[i]='1';
            if(i+1<s.length()){
                b1[i+1]='1';
            }
            sum1++;
        }
    }
    byte[] b0 = s.getBytes();
    int sum0 = 0;
    for(int i = 0;i<s.length();i++){
        if(b0[i]=='1'){
            b0[i]='0';
            if(i+1<s.length()){
                b0[i+1]='0';
            }
            sum0++;
        }
    }
    return Math.min(sum0,sum1);
}

其中sum1和sum0分别表示将需要操作的字符串全部变成1和全部变成0所需要的次数,计算sum1和sum0的思路是,循环遍历字符串的每一个元素,然后遇到跟需要的字符不一致的时候,我们就将这一位以及下一位变成所需要的(不管下一位是否是所需要的字符,如果是需要的变一下没有影响,如果不是需要的正好可以变成所需要的),最后将两者的最小值进行返回。然后最终也是通过了测试。

后来我用AI刷题帮我分析了一下代码,他的分析如下:

你的代码逻辑基本上是正确的,但有一些地方可以优化和修正。以下是一些建议:

  1. 字符比较:在Java中,字符比较应该使用单引号,并且应该使用 == 来比较字符。你当前使用的是 b1[i]=='0',这是正确的。
  2. 字符转换:你将字符转换为 byte 类型,然后进行比较和修改。虽然这在Java中是可行的,但直接使用字符会更直观。
  3. 代码重复:你在代码中重复了两次几乎相同的逻辑,一次是为了将所有字符变为 '1',另一次是为了将所有字符变为 '0'。可以考虑将这部分逻辑提取为一个单独的方法。
  4. 边界条件:你在处理 i+1 时已经考虑了边界条件,这是正确的。

我觉得他给出的建议非常好,我在写solution函数的时候确实有很多代码是重复的,AI给出的建议是单独抽成一个函数,然后调用两次,我觉得这点对我的帮助很大。同时他也注意到了将下一位变成所需要的字符的时候,可能会抛出索引越界异常,所以再将下一位变成所需要的字符之前需要先判断一下i+1是不是满足要求。

AI刷题能够在学生作答后即时给予反馈,详细解析每个错误的原因,并提供相关的学习资源和解题技巧。这种及时的反馈机制帮助学生快速理解自己的错误,避免重复犯同样的错误,同时也提高了学习的效率和效果。相比传统的刷题方式,AI刷题不仅能节省大量时间,还能保证每次练习后的反馈都能及时到位,帮助学生快速调整学习策略和方法。