如何在目标上方的数组中找到最接近的数字?

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 或在未找到最接近的值时抛出异常是有意义的。

以上是关于如何在目标上方的数组中找到最接近的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在最接近条件的数组中查找数据

在多维数组中找到两个相关数字的最接近组合

在数组中查找匹配或最接近的值

如何从数组中查找最接近500的数字

c_cpp 在排序数组中,找到最接近给定数字的数字

PHP 按时间排序数组并找到与 X 数字最接近的匹配项