CodingBat 帮助计算数组中的元素
CodingBat help on counting elements in array
我正在 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
的那一刻起停止。但我建议不要使用它,因为它会使代码更难读。
EDIT(因为连续两次 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 上对此进行了测试,确实,这似乎是问题所在。
解决问题的一种方法是添加 "zero length" 检查:
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 的赞美,因为它让程序员意识到 防御性 和 全面编程 。
public boolean haveThree(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 3) {
if (nums.length > 1) {
if (i == nums.length - 1 && nums[i - 1] != 3) {
count++;
} else if (i < nums.length - 1 && nums[i + 1] != 3) {
count++;
}
}
}
}
return count == 3;
}
我正在 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
的那一刻起停止。但我建议不要使用它,因为它会使代码更难读。
EDIT(因为连续两次 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 上对此进行了测试,确实,这似乎是问题所在。
解决问题的一种方法是添加 "zero length" 检查:
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 的赞美,因为它让程序员意识到 防御性 和 全面编程 。
public boolean haveThree(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 3) {
if (nums.length > 1) {
if (i == nums.length - 1 && nums[i - 1] != 3) {
count++;
} else if (i < nums.length - 1 && nums[i + 1] != 3) {
count++;
}
}
}
}
return count == 3;
}