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

LeetCode33题代码疑问:为何while循环中return未退出函数?

问题分析与修复

首先明确:return mid语句执行后会立即终止整个search函数,不可能出现“打印日志后循环仍继续执行”的情况。你观察到的异常现象,本质是代码其他部分的错误引发的(比如数组越界、无限循环卡死),而非return语句失效。

代码中的核心错误

1. 寻找旋转点的循环无限卡死

原代码判断旋转点的逻辑错误,当数组长度为2且旋转过(如[3,1]),循环会无限执行:

  • 初始low=0,high=1,mid=0
  • 因nums[low] > nums[high],设置low=mid=0,此时low < high仍成立,循环重复执行,永远到不了后续的二分查找步骤。

修复方式:调整旋转点判断逻辑,通过比较nums[mid]和nums[high]来定位旋转点:

while (low < high) {
    mid = low + (high - low) / 2
    if (nums[mid] > nums[high]) {
        // 旋转点在右半部分,缩小左边界
        low = mid + 1
    } else {
        // 旋转点在左半部分或当前mid就是旋转点,缩小右边界
        high = mid
    }
}
val pivot = low // 循环结束后low==high,即为旋转点索引

2. 区间判断触发数组越界

当数组未旋转时,旋转点pivot=0,原代码中target <= nums[mid - 1]会访问nums[-1],直接触发数组索引越界异常,导致程序崩溃。

修复方式:基于旋转点pivot调整区间判断逻辑,避免越界:

low = 0
high = nums.size - 1
if (pivot != 0) {
    if (target >= nums[0] && target <= nums[pivot - 1]) {
        // 目标在左半升序区间
        high = pivot - 1
    } else {
        // 目标在右半升序区间
        low = pivot
    }
}
// 若pivot=0,数组未旋转,直接在整个数组查找

3. 二分查找阶段的边界更新错误

原代码中当target > nums[mid]时设置low=mid,会导致当low和high相邻时无法收敛,进入无限循环(如low=2、high=3,mid=2,target大于nums[2]时,low始终为2,循环无法结束)。

修复方式:将low=mid改为low=mid+1,确保边界能正确收敛:

while (low <= high) {
    mid = low + (high - low) / 2
    if (nums[mid] == target) {
        println("LALALALA")
        return mid
    }
    if (target < nums[mid]) {
        high = mid - 1
    } else {
        low = mid + 1 // 修正此处
    }
}

完整修复代码

class Solution {
    fun search(nums: IntArray, target: Int): Int {
        if (nums.isEmpty()) return -1

        var low = 0
        var high = nums.size - 1
        var mid = 0

        // 寻找旋转点pivot
        while (low < high) {
            mid = low + (high - low) / 2
            if (nums[mid] > nums[high]) {
                low = mid + 1
            } else {
                high = mid
            }
        }
        val pivot = low

        // 确定目标所在区间
        low = 0
        high = nums.size - 1
        if (pivot != 0) {
            if (target >= nums[0] && target <= nums[pivot - 1]) {
                high = pivot - 1
            } else {
                low = pivot
            }
        }

        // 二分查找目标
        while (low <= high) {
            mid = low + (high - low) / 2
            if (nums[mid] == target) {
                println("LALALALA")
                return mid
            }
            if (target < nums[mid]) {
                high = mid - 1
            } else {
                low = mid + 1
            }
        }

        return -1
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:47:11