使用二分查找寻找有序数组中正整数首次出现位置的代码问题排查
问题分析与修正方案
看起来你写的这段二分查找代码是想在有序数组里找到特定正整数的首次出现位置,但目前有几个关键问题导致它无法正常工作,咱们一步步拆解:
现存问题
- 缺少目标参数:你的函数
findFirstOccurrence只接收了数组arr,但没有传入要查找的目标正整数——总不能让程序猜你要找哪个数吧😅 - 判断逻辑偏离需求:代码里一直在和
0比较,而不是和目标数比较。如果你的需求是找第一个大于0的元素,这逻辑还有点沾边,但如果是找某个特定正整数(比如2),这完全不对。 - 匹配到目标时的处理错误:原代码里的分支逻辑没有处理“找到目标数”的情况,反而把等于
0的情况归到了向右搜索的分支,这会直接错过左侧更早出现的目标项。
修正后的代码
def findFirstOccurrence(arr, target): # 先校验目标数是否为正整数,不符合直接返回-1 if not isinstance(target, int) or target <= 0: return -1 left, right = 0, len(arr) - 1 result = -1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: # 找到匹配项,记录位置,继续向左找更早的出现 result = mid right = mid - 1 elif arr[mid] < target: # 目标在右侧,调整左边界 left = mid + 1 else: # 目标在左侧,调整右边界 right = mid - 1 return result
代码说明
- 新增了
target参数,明确要查找的正整数 - 加了简单的参数校验,确保目标是符合要求的正整数
- 修正了二分核心逻辑:
- 当匹配到目标时,记录当前位置并向左继续搜索,保证找到的是首次出现的位置
- 当中间元素小于目标,说明目标在右半区,移动左边界
- 当中间元素大于目标,说明目标在左半区,移动右边界
测试示例
比如测试数组[-3, -1, 2, 2, 4, 5],查找目标2:
arr = [-3, -1, 2, 2, 4, 5] print(findFirstOccurrence(arr, 2)) # 输出2,正确对应第一个2的索引
内容的提问来源于stack exchange,提问作者faint
相关产品推荐
相关产品推荐

