[英]CodingBat help on counting elements in array
我在codingbat上解决了这个问题,它表明我的代码适用于所有情况,但不适用于其他情况。
给定一个整数数组,如果值3恰好出现在数组中3次,并且没有3的>彼此相邻,则返回true。
haveThree({3,1,3,1,3})→true
haveThree({3,1,3,3})→否
haveThree({3,4,3,3,4})→否
我的代码:
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
s,则可以使用两个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
s来加快某些方面的速度,但是考虑到问题的级别(没有侮辱性的意图),您最好遵循职责分离的范式:让代码的不同部分做不同的事情。
如果你真的想将它合并成一个单一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++;
现在将不存在-1
作为索引而对if(nums[-1] == 3)
进行查询,因此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表示赞赏,以使程序员意识到防御性和总体编程能力 。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.