我今天利用豆包的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刷题帮我分析了一下代码,他的分析如下:
你的代码逻辑基本上是正确的,但有一些地方可以优化和修正。以下是一些建议:
- 字符比较:在Java中,字符比较应该使用单引号,并且应该使用
==来比较字符。你当前使用的是b1[i]=='0',这是正确的。 - 字符转换:你将字符转换为
byte类型,然后进行比较和修改。虽然这在Java中是可行的,但直接使用字符会更直观。 - 代码重复:你在代码中重复了两次几乎相同的逻辑,一次是为了将所有字符变为 '1',另一次是为了将所有字符变为 '0'。可以考虑将这部分逻辑提取为一个单独的方法。
- 边界条件:你在处理
i+1时已经考虑了边界条件,这是正确的。
我觉得他给出的建议非常好,我在写solution函数的时候确实有很多代码是重复的,AI给出的建议是单独抽成一个函数,然后调用两次,我觉得这点对我的帮助很大。同时他也注意到了将下一位变成所需要的字符的时候,可能会抛出索引越界异常,所以再将下一位变成所需要的字符之前需要先判断一下i+1是不是满足要求。
AI刷题能够在学生作答后即时给予反馈,详细解析每个错误的原因,并提供相关的学习资源和解题技巧。这种及时的反馈机制帮助学生快速理解自己的错误,避免重复犯同样的错误,同时也提高了学习的效率和效果。相比传统的刷题方式,AI刷题不仅能节省大量时间,还能保证每次练习后的反馈都能及时到位,帮助学生快速调整学习策略和方法。