gpt4 book ai didi

java - CodingBat 帮助计算数组中的元素

转载 作者:行者123 更新时间:2023-11-30 03:35:58 27 4
gpt4 key购买 nike

我正在 codingbat 上解决这个问题它表明我的代码适用于所有情况,但不适用于其他情况。

Given an array of ints, return true if the value 3 appears in the array exactly 3 times, and no 3's > are next to each other.

haveThree({3, 1, 3, 1, 3}) → true

haveThree({3, 1, 3, 3}) → false

haveThree({3, 4, 3, 3, 4}) → false

我的代码:

public boolean haveThree(int[] nums) {
int count=0;
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 3 && nums[i + 1] == 3)
return false;
if (nums[i] == 3)
count++;
}
if (nums[nums.length-1] == 3)
count++;
return(count==3);
}

这些是测试结果:

Expected Run        
have Three({3, 1, 3, 1, 3}) → true true OK
have Three({3, 1, 3, 3}) → false false OK
have Three({3, 4, 3, 3, 4}) → false false OK
have Three({1, 3, 1, 3, 1, 2}) → false false OK
have Three({1, 3, 1, 3, 1, 3}) → true true OK
have Three({1, 3, 3, 1, 3}) → false false OK
have Three({1, 3, 1, 3, 1, 3, 4, 3}) → false false OK
have Three({3, 4, 3, 4, 3, 4, 4}) → true true OK
have Three({3, 3, 3}) → false false OK
have Three({1, 3}) → false false OK
have Three({3}) → false false OK
have Three({1}) → false false OK
other tests X

最佳答案

你把事情弄得太复杂了,只需计算 3 出现的次数并执行检查:

int count=0;
for(int i=0; i < nums.length; i++){
if(nums[i]==3)
count++;
}
return (count == 3);

或者,您可以让事情变得更快一点,因为如果您在位置 n-1 并且到目前为止您只计算过没有或只有一个 3,您知道这可能会失败,因此:

for(int i=0; count <= 3 && (count == 3 || i < nums.length-2+count); i++){
if(nums[i]==3)
count++;
}
return count == 3;

这也会在遇到超过三个 3 时停止。但我建议不要使用它,因为它会使代码更难以阅读。

编辑(因为连续两个 3 应该失败):

如果不应出现两个连续的 3,您可以使用两个 for 循环来修改它:

int count=0;
for(int i=0; i < nums.length-1; i++){
if(nums[i] == 3 && nums[i+1] == 3) {
return false;
}
}
for(int i=0; i < nums.length; i++){
if(nums[i]==3)
count++;
}
return (count == 3);

同样,您可以通过合并两个for来加快某些方面的速度,但考虑到您的问题的级别 - 无意冒犯 - 您最好遵循职责分离范例:让代码的不同部分做不同的事情。

如果您确实想将其合并为一个for,您可以通过以下方式完成:

int count=0;
for(int i=0; i < nums.length; i++){
if(nums[i] == 3) {
count++;
if(i+1 < nums.length && nums[i+1] == 3) {
return false;
}
}
}
return (count == 3);

最后为了让事情变得完整,您还应该包括一个 null 检查,最终版本如下:

public boolean haveThree (int[] nums) {
if(nums == null) {
return false;
}
int count=0;
for(int i=0; i < nums.length && count <= 3; i++){
if(nums[i] == 3) {
count++;
if(i+1 < nums.length && nums[i+1] == 3) {
return false;
}
}
}
return (count == 3);
}

您的代码可能有什么问题

有人可能输入一个带有.length == 0的数组,在这种情况下,这个片段:

if (nums[nums.length-1] == 3)
count++;

将导致对 if(nums[-1] == 3) 的查询,现在 -1 不作为索引存在,因此 IndexOutOfBoundsException 。我在 CodeBat 上测试了这一点,确实,这似乎是问题所在。

解决该问题的一种方法是添加“零长度”检查:

public boolean haveThree(int[] nums) {
if(nums.length <= 0) //hint, although a length is never negative, one better uses "strong conditions"
return false;
int count=0;
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 3 && nums[i + 1] == 3)
return false;
if (nums[i] == 3)
count++;
}
if (nums[nums.length-1] == 3)
count++;
return(count==3);
}

但我建议使用上述版本,因为这些通常是减少错误的方法。

我对CodeBat表示赞扬,它让程序员意识到防御性全面编程

关于java - CodingBat 帮助计算数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27876450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com