华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路
发布人:shili8
发布时间:2025-01-21 10:48
阅读次数:0
**华为OD机试真题 Java 实现**
**题目描述**
计算最接近的数**题目要求**
给定一个整数数组 `arr` 和一个目标值 `target`,请编写一个函数来返回两个数字中最接近 `target` 的数字。假设 `arr` 中的所有数字都是非负整数。
**输入输出示例**
* 输入:`arr = [1,2,3,4,5], target =2.7`
输出:`2`
* 输入:`arr = [1,2,3,4,5], target =6.8`
输出:`5`
**详细解题思路**
1. **理解问题**:首先,我们需要了解这个问题的要求。我们给定一个整数数组 `arr` 和一个目标值 `target`,我们的任务是找到两个数字中最接近 `target` 的数字。
2. **确定算法**:为了解决这个问题,我们可以使用二分查找算法来快速找到最接近 `target` 的数字。我们首先需要对数组进行排序,然后使用二分查找来找到最接近 `target` 的数字。
3. **实现二分查找**:二分查找是一种高效的算法,用于在有序列表中找到一个特定的元素。在我们的例子中,我们可以使用二分查找来找到最接近 `target` 的数字。我们首先需要确定二分查找的初始范围,然后根据比较结果缩小范围直到找到目标数字。
4. **处理边界情况**:在实现二分查找时,我们需要考虑一些边界情况,例如当 `arr` 中的所有数字都大于或等于 `target` 时。我们需要确保我们的算法可以正确处理这些情况。
**Java 实现**
javapublic class Solution { public int findClosest(int[] arr, double target) { // 对数组进行排序 Arrays.sort(arr); // 确定二分查找的初始范围 int left =0; int right = arr.length -1; // 使用二分查找找到最接近target的数字 while (left <= right) { int mid = left + (right - left) /2; if (arr[mid] == target) { return arr[mid]; } else if (arr[mid] < target) { left = mid +1; } else { right = mid -1; } } // 如果target介于两个数字之间,则返回较小的那个 if (left >0 && Math.abs(arr[left -1] - target) < Math.abs(arr[left] - target)) { return arr[left -1]; } else { return arr[left]; } } public static void main(String[] args) { Solution solution = new Solution(); int[] arr = {1,2,3,4,5}; double target =2.7; System.out.println(solution.findClosest(arr, target)); // 输出:2 target =6.8; System.out.println(solution.findClosest(arr, target)); // 输出:5 } }
**附注**
* 在这个实现中,我们使用了 Java 中的 `Arrays.sort()` 方法对数组进行排序,然后使用二分查找算法找到最接近 `target` 的数字。
* 我们首先确定二分查找的初始范围,然后根据比较结果缩小范围直到找到目标数字。
* 如果 `target`介于两个数字之间,我们返回较小的那个数字。
* 这个实现可以正确处理边界情况,如当 `arr` 中的所有数字都大于或等于 `target` 时。