如何修改Java代码查找数组中大于目标值的最近数字
修改思路
原代码的判断逻辑只比较了差值的绝对值大小,当两个数和目标的差值相同时,不会替换先遍历到的更小的数,所以才会出现目标为5时优先返回4而非7的情况。
要实现优先返回大于目标值的最近数,只需要调整判断条件,规则如下:
- 优先选择差值更小的数
- 当两个数和目标的差值相等时,选择数值更大的那个
- 也可以根据需求额外加限制:只在大于等于目标值的数里找最近值,如果没有符合条件的数再做兜底处理
版本1:差值相同时优先返回更大的数
该版本依旧会考虑小于目标值的数,仅当两个数和目标的差值完全相等时,优先选择更大的那个,完全匹配你提到的示例需求:
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); // 调整判断逻辑:差值更小 或者 差值相同但当前数更大 if (cdist < dist || (cdist == dist && arr[i] > arr[idx])) { idx = i; dist = cdist; } } Log.e("FIND!!!", "CLOSEST MINUTE IS --->" + arr[idx]); int minute_of_day = arr[idx]; return minute_of_day; }
版本2:严格只返回大于等于目标值的最近数
如果需求是优先找大于等于目标的数,只有数组里完全没有符合条件的数时才兜底返回其他值,可以用这个版本:
public static int findClosest(Integer[] arr, int target) { int idx = -1; int minDist = Integer.MAX_VALUE; for (int i = 0; i < arr.length; i++) { // 只筛选大于等于目标值的元素做比较 if (arr[i] >= target) { int cdist = arr[i] - target; if (cdist < minDist) { minDist = cdist; idx = i; } } } // 兜底逻辑:如果没有大于等于目标的数,默认返回数组最大值,可按需修改 if (idx == -1) { for (int i = 0; i < arr.length; i++) { if (idx == -1 || arr[i] > arr[idx]) { idx = i; } } } Log.e("FIND!!!", "CLOSEST MINUTE IS --->" + arr[idx]); return arr[idx]; }
内容的提问来源于stack exchange,提问作者MArio
相关产品推荐
相关产品推荐

