如何在目标上方的数组中找到最接近的数字?
How to find closest number in array above target?
我使用此代码查找数组中最接近的数字,但此方法也是 return 低于目标数字的数字。所以如果目标是 5 并且数组有 4 个 7 它将 return 4。
我如何更改此代码以显示高于目标的最近数字。
public static int findClosest(Integer[] arr, int target) {
int idx = 0;
int dist = Math.abs(arr[0] - target);
for (int i = 1; i < arr.length; i++) {
int cdist = Math.abs(arr[i] - target);
//TODO MAKE CLOSEST NUMBER BE ABOVE TARGET
if (cdist < dist) {
idx = i;
dist = cdist;
}
}
Log.e("FIND!!!", "CLOSEST MINUTE IS --->" + arr[idx]);
int minute_of_day = arr[idx];
return minute_of_day;
}
这是一种方法(需要导入 java.util 包)- 按升序对数组进行排序,然后找到第一个更高的元素(如果存在)。数组中可能不存在更高的值,因此必须处理该错误。
public static int findClosestHigher(Integer[] arr, int target) throws NoSuchElementException {
List<Integer> arrList = Arrays.asList(arr);
Collections.sort(arrList);
for (int element : arrList) {
if (element > target) {
System.out.println("FOUND!!! CLOSEST HIGHER IS --->" + element);
return element;
}
}
throw new NoSuchElementException();
}
只需根据您的要求修改代码:找到超出目标的最少数量。检查输入数组中的 null
值也是有意义的。
public static Integer findClosestAbove(Integer[] arr, int target) {
Integer min = null;
for (Integer x : arr) {
if (x != null && x > target && (min == null || min > x)) {
min = x;
}
}
return min; // may be null
}
使用Java流API的类似解决方案如下:
public static Integer findClosestAboveStream(Integer[] arr, int target) {
return Arrays.stream(arr)
.filter(x -> x != null && x > target)
.min(Integer::compareTo) // Optional<Integer>
.orElse(null); // or orElseGet(() -> null)
}
测试:
Integer[] arr = new Integer[]{1, 2, null, 7, 4};
System.out.println("findClosest:\t" + findClosestAbove(arr, 5));
System.out.println("findClosest2:\t" + findClosestAboveStream(arr, 5));
输出:
findClosest: 7
findClosest2: 7
一种替代方法是以下方法:
public static int findClosest(Integer[] arr, int target) {
int temp = Integer.MAX_VALUE;
for(int i: arr){
if(i > target && i < temp){
temp = i;
}
}
return temp;
}
此代码的工作方式是,它首先初始化一个整数,temp
为可能的最大整数。然后,我们开始遍历 arr
,每当我们发现一个值大于目标值但小于 temp
的当前值时,我们将 temp
设置为等于该值。最后,在我们遍历之后,我们 return 该值。
我使用此代码查找数组中最接近的数字,但此方法也是 return 低于目标数字的数字。所以如果目标是 5 并且数组有 4 个 7 它将 return 4。 我如何更改此代码以显示高于目标的最近数字。
public static int findClosest(Integer[] arr, int target) {
int idx = 0;
int dist = Math.abs(arr[0] - target);
for (int i = 1; i < arr.length; i++) {
int cdist = Math.abs(arr[i] - target);
//TODO MAKE CLOSEST NUMBER BE ABOVE TARGET
if (cdist < dist) {
idx = i;
dist = cdist;
}
}
Log.e("FIND!!!", "CLOSEST MINUTE IS --->" + arr[idx]);
int minute_of_day = arr[idx];
return minute_of_day;
}
这是一种方法(需要导入 java.util 包)- 按升序对数组进行排序,然后找到第一个更高的元素(如果存在)。数组中可能不存在更高的值,因此必须处理该错误。
public static int findClosestHigher(Integer[] arr, int target) throws NoSuchElementException {
List<Integer> arrList = Arrays.asList(arr);
Collections.sort(arrList);
for (int element : arrList) {
if (element > target) {
System.out.println("FOUND!!! CLOSEST HIGHER IS --->" + element);
return element;
}
}
throw new NoSuchElementException();
}
只需根据您的要求修改代码:找到超出目标的最少数量。检查输入数组中的 null
值也是有意义的。
public static Integer findClosestAbove(Integer[] arr, int target) {
Integer min = null;
for (Integer x : arr) {
if (x != null && x > target && (min == null || min > x)) {
min = x;
}
}
return min; // may be null
}
使用Java流API的类似解决方案如下:
public static Integer findClosestAboveStream(Integer[] arr, int target) {
return Arrays.stream(arr)
.filter(x -> x != null && x > target)
.min(Integer::compareTo) // Optional<Integer>
.orElse(null); // or orElseGet(() -> null)
}
测试:
Integer[] arr = new Integer[]{1, 2, null, 7, 4};
System.out.println("findClosest:\t" + findClosestAbove(arr, 5));
System.out.println("findClosest2:\t" + findClosestAboveStream(arr, 5));
输出:
findClosest: 7
findClosest2: 7
一种替代方法是以下方法:
public static int findClosest(Integer[] arr, int target) {
int temp = Integer.MAX_VALUE;
for(int i: arr){
if(i > target && i < temp){
temp = i;
}
}
return temp;
}
此代码的工作方式是,它首先初始化一个整数,temp
为可能的最大整数。然后,我们开始遍历 arr
,每当我们发现一个值大于目标值但小于 temp
的当前值时,我们将 temp
设置为等于该值。最后,在我们遍历之后,我们 return 该值。