我必须编写一个方法,如果整数数组中存在三个3(如果它们不连续),则返回true。 我在这里编写了这段代码:但是,它返回的是true(它不应该这样做)。有人可以指出我的错误吗? arr [] = {{4,3,5,2,3,3};
这也是一个线性算法。可以做得更好吗?
public static boolean consecutiveThree(int[] arr) {
int x=0;
for(int i=0;i<arr.length-1;i++) {
if((arr[i]!=3 && arr[i+1]==3) || (arr[i]==3 && arr[i+1]!=3)) {
x++;
//continue;
}
if(x==3)
return true;
}
return false;
}
答案 0 :(得分:1)
在最坏的情况下,正确的数组将以... 3 3 X 3
结尾。除非数组有点排序或有点特殊,否则您必须查看每个元素才能达到最后三个3s。如果数组是随机的,则需要线性复杂度,因为必须检查数组中的每个元素。
答案 1 :(得分:1)
您说:
如果整数数组中存在三个3 ,则返回true(前提是不连续)
我将其解释为至少具有三个3,并且没有两个相邻的3。
public static boolean hasThreeNonconsecutiveThrees(int... values) {
int count = 0, streak = 0;
for (int value : values) {
if (value != 3)
streak = 0;
else if (++streak == 2)
return false; // Found two consecutive (adjacent) 3s
else
count++;
}
return (count >= 3);
}
测试
System.out.println(hasThreeNonconsecutiveThrees(4,3,5,2,3,3)); // false
System.out.println(hasThreeNonconsecutiveThrees(4,3,5,3,2,3)); // true
System.out.println(hasThreeNonconsecutiveThrees(1,2,3,4,3)); // false
System.out.println(hasThreeNonconsecutiveThrees(4,3,5,3,3,3)); // false
输出
false
true
false
false
答案 2 :(得分:0)
您的算法没有检查arr[i-1]
是否为 '3' 。那是你算法的错误。
尝试一下:-
public static boolean consecutiveThree(int[] arr) {
int x = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 3) {
if (i == 0) { // zero 'th element do not have arr[i-1].
if(arr[i + 1] != 3) {
x++;
}
} else if (i == arr.length - 1) { // last element do not have arr[i+1].
if((arr[i - 1] != 3)) {
x++;
}
} else if ((arr[i + 1] != 3) && (arr[i - 1] != 3)) {
x++;
}
}
if (x == 3) // may be x >= 3
return true;
}
return false;
}