如何在目标上方的数组中找到最接近的数字?
Posted
技术标签:
【中文标题】如何在目标上方的数组中找到最接近的数字?【英文标题】:How to find closest number in array above target? 【发布时间】:2021-11-09 04:38:59 【问题描述】:我使用此代码在数组中查找最接近的数字,但此方法也返回低于目标数字的数字。所以如果目标是 5 并且数组有 4 a 7 它将返回 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;
【问题讨论】:
【参考方案1】:这里有一种方法(需要导入 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();
【讨论】:
【参考方案2】:只需根据您的要求修复代码:找到高于目标的最少数量。检查输入数组中的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 Stream 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
【讨论】:
【参考方案3】:另一种方法是以下方法:
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
设置为等于该值。最后,在我们迭代之后,我们返回那个值。
【讨论】:
这里Integer.MAX_VALUE
在两种情况下返回:1)根本找不到目标,2)最接近的值实际上是Integer.MAX_VALUE
。由于输入列表包含Integer
,因此返回null
或在未找到最接近的值时抛出异常是有意义的。以上是关于如何在目标上方的数组中找到最接近的数字?的主要内容,如果未能解决你的问题,请参考以下文章