我在codingbat上解决了这个问题,它表明我的代码适用于所有情况但不适用于其他情况。
给定一个int数组,如果值3在数组中恰好出现3次,则返回true,并且没有3> s>彼此相邻。
haveThree({3,1,3,1,3})→true
拥有三个({3,1,3,3})→false
拥有三个({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
答案 0 :(得分:1)
你太复杂了,只需计算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
加快某些方面,但考虑到您的问题的级别 - 没有侮辱意图 - 您最好遵循责任分离范式:让代码的不同部分做了不同的事情。
如果您真的想将其合并为一个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
上的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);
}
查询不会作为索引存在,因此IndexOutOfBoundsException。我在 CodeBat 上测试了这个,事实上,这似乎是问题所在。
解决问题的方法是添加“零长度”检查:
{{1}}
但是我会建议使用上面提到的版本,因为这些 - 通常是 - 减少错误的方法。
我赞赏 CodeBat 让程序员了解防御和总编程。
答案 1 :(得分:1)
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;
}