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

Java二分查找无法正确统计搜索次数及返回索引值问题求助

搞定你的二分查找返回-1问题

嘿,我来帮你排查下这个头疼的问题——明明目标数字应该在1-131073的数组里,结果二分查找却一直返回代表“不存在”的-1。结合你的描述,我整理了几个最容易踩的坑和对应的解决办法:

1. 数组读取出问题了!

从文本文件读数组的时候,很容易因为格式不匹配搞砸:

  • 先检查你的文本文件是不是每行一个数字?或者有没有用逗号/空格分隔?如果你的读取逻辑和文件格式对不上,数组里可能会有缺失元素、乱序,甚至读出来的是字符串(比如"123"而不是整数123)。
  • 一定要验证读取后的数组:长度是不是刚好131073?元素是不是从1到131073严格递增?二分查找的核心前提是数组必须有序,乱序的话查找肯定失效。

2. 二分查找的边界条件写错了

这是二分查找最常见的bug,比如:

  • 初始的high设成了len(arr)而不是len(arr)-1(数组索引从0开始啊!),这会导致最后一次查找越界,直接错过目标值。
  • 循环终止条件用了low < high而不是low <= high,会漏掉最后一次可能匹配的情况。
  • 更新low或high的时候出错:比如目标值比arr[mid]大,应该把low = mid + 1,而不是low = mid,不然会陷入死循环或者缩错区间。

给你一个正确的二分查找示例(带搜索次数统计),你可以对比自己的代码:

class BinarySearch:
    def __init__(self, arr):
        self.arr = arr
    
    def find_number(self, target):
        low = 0
        high = len(self.arr) - 1
        search_times = 0
        
        while low <= high:
            search_times += 1
            mid = (low + high) // 2
            if self.arr[mid] == target:
                print(f"搜索次数:{search_times}")
                return mid
            elif self.arr[mid] < target:
                low = mid + 1
            else:
                high = mid - 1
        
        print(f"搜索次数:{search_times}")
        return -1

3. 目标值和数组元素类型不匹配

比如你从文件里读出来的是字符串类型的数字,而你要查找的是整数,这时候==判断会直接返回False,自然找不到。解决办法是读取的时候把每个元素转成整数:

# 举个读取文件的正确例子
with open("your_numbers_file.txt", "r") as f:
    # 跳过空行,把每行转成整数
    num_array = [int(line.strip()) for line in f if line.strip()]

4. 最后再确认下:目标值真的在数组里吗?

虽然你说文件是1-131073,但还是要检查下:你要找的数字是不是在1到131073之间?有没有可能输入的时候打错了(比如多打了个0)?可以先用target in num_array快速验证一下(虽然这会遍历数组,但能快速确认问题出在查找逻辑还是数组本身)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:24:26