当前位置:实例文章 » JAVA Web实例» [文章]华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路

华为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` 时。

其他信息

其他资源

Top