例如:
int[] arr = {1,2,2,3,4,5};
3
只存在一次,方法应该返回true
,2
存在两次,方法应该返回false
,0
不存在,方法应该返回false
。我一直得到一个运行时错误,我如何修复它,或者有任何方法(仅递归)。下面是我的代码:
public static boolean list(int[] a, int num) {
return helper(a, 0, num);
}
public static boolean helper(int[] a, int i, int num) {
int count = 0;
if (a[i] == num)
count++;
if (count == 1 && i == a.length)
return true;
else if (count != 1 && i == a.length)
return false;
else
return helper(a, i++, num);
}
我运行你的代码,得到一个java.lang.StackOverflowError。这表明您的递归方法,名为helper
,一直无限地调用自己。这是因为return
语句之前的if
语句中的两个条件都不为真。
当以下两个条件之一为真时,您不希望递归地调用该方法:
- 您遇到了第二次在数组中搜索的数字。
- 您已到达数组的末尾。
如果每次调用helper
方法时都将count
初始化为0,那么它将永远不会大于1。因此,您应该将其作为方法helper
的参数。
您只需要检查i
是否等于a.length
就可以确定您是否到达了数组的末尾。
/**
* Determines whether 'num' occurs exactly once in 'a'.
*
* @param a - array to search
* @param count - number of occurrences of 'num' in 'a'
* @param i - index in 'a'
* @param num - number to search for
*
* @return 'true' if 'num' occurs exactly once in 'a', otherwise 'false'.
*/
public static boolean helper2(int[] a, int count, int i, int num) {
if (count > 1) {
return false;
}
if (i == a.length) {
return count == 1;
}
if (a[i] == num) {
count++;
}
return helper2(a, count, i + 1, num);
}
方法的初始调用是(例如,如果您正在检查数字3
是否只在数组中出现一次)
int[] a = new int[]{1, 2, 2, 3, 4, 5}; // array of integers to search
int count = 0; // number of occurrences
int index = 0; // index in 'a'
int num = 3; // number to search for
boolean single = helper2(a, count, index, num);
使用迭代方法要容易得多:
public static boolean iterativeMethod(int[] arr, int number) {
// filter the desired numbers in the array
// and check if their quantity is equal to '1'
return Arrays.stream(arr).filter(i -> i == number).count() == 1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 2, 3, 4, 5};
System.out.println(iterativeMethod(arr, 3)); // true
System.out.println(iterativeMethod(arr, 2)); // false
System.out.println(iterativeMethod(arr, 0)); // false
}