递归方法,如果整数在数组中只存在一次,则返回true



例如:

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语句中的两个条件都不为真。

当以下两个条件之一为真时,您不希望递归地调用该方法:

  1. 您遇到了第二次在数组中搜索的数字。
  2. 您已到达数组的末尾。

如果每次调用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
}

相关内容

  • 没有找到相关文章

最新更新