You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二分查找代码Bug排查:目标值0索引返回异常问题

二分查找代码Bug排查与修复

这段二分查找代码在查找目标值0时无法返回正确索引(数组中0的索引为2),但其他数值查找正常,问题出在比较逻辑的错误使用:

在升序(isAsc为true)和降序的分支中,代码错误地将索引值mid与目标值target进行比较,而正确的逻辑应该是用arr[mid](索引mid对应的数组元素)和target比较。

举个实际执行的例子,当查找0时:

  1. 初始start=0,end=7,计算mid=3,此时arr[mid]=3,不等于0
  2. 进入升序分支,代码判断mid < target(即3 < 0),条件不成立,于是将end设为mid-1=2
  3. 下一轮循环start=0,end=2,mid=1,arr[mid]=-5不等于0
  4. 再次进入升序分支,判断1 < 0不成立,end设为0
  5. 最后一轮循环start=0,end=0,mid=0,arr[mid]=-14不等于0
  6. 判断0 < 0不成立,end设为-1,循环结束返回-1,自然找不到正确索引

修复后的代码

public class binarySearch {
    public static void main(String[] args) {
        int[] arr = {-14, -5, 0, 3, 23, 49, 74, 106};
        int target = 0;
        int ans = answer(arr, target);
        System.out.println(ans);
    }

    static int answer(int[] arr, int target) {

        int start = 0;
        int end = arr.length - 1;

        boolean isAsc = arr[start] < arr[end];

        while(start <= end) {
            int mid = start + (end - start) / 2;

            if(arr[mid] == target) {
                return mid;
            }

            if(isAsc) {
                // 修正:用数组元素与目标值比较,而非索引与目标值比较
                if(arr[mid] < target) {
                    start = mid + 1;
                }
                else {
                    end = mid - 1;
                }
            }
            else {
                // 修正:用数组元素与目标值比较,而非索引与目标值比较
                if(arr[mid] < target) {
                    end = mid - 1;
                }
                else {
                    start = mid + 1;
                }
            }
        }
        return -1;
    }
}

关键修复点

  • 将升序分支中的mid < target改为arr[mid] < target
  • 将降序分支中的mid < target改为arr[mid] < target

修复后再运行代码,查找目标值0时会正确返回索引2,其他数值的查找逻辑也保持正常。

内容的提问来源于stack exchange,提问作者user21113485

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:23:21