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

为何GFG可运行的C++旋转次数查找代码在Java中报索引越界?

问题

一段用于查找数组旋转次数的C++代码在GeeksforGeeks平台可正常运行,但在Java环境中运行时,针对长度为5的数组出现了索引-1超出范围的错误,请问产生该错误的原因是什么?

原C++代码

int findKRotation(int arr[], int n) {
    // code here
    if(n==1)
    return 0;
    
    int s = 0;
    int e = n - 1;
    while(s<=e){
        int mid = s +(e-s)/2;
        if(arr[mid] >= arr[mid-1] && arr[mid] >= arr[mid+1]){
            return mid+1;
        }
        else if(arr[mid] < arr[n-1]){
            e = mid -1;
        }
        else{
            s = mid +1;
        }
    }
   return s ; 
}

错误原因

  1. Java的严格索引校验机制:Java会强制检查数组索引的合法性,当代码中mid的值为0时,arr[mid-1]等价于访问arr[-1],这直接违反了数组索引必须非负且小于数组长度的规则,因此会抛出ArrayIndexOutOfBoundsException。
  2. C++的未定义行为特性:C++本身不做数组边界检查,访问arr[-1]会读取数组首元素之前的内存区域,属于未定义行为。GFG的测试用例可能刚好没有触发程序崩溃的场景,或者测试数据中mid从未取到0,所以代码看似正常运行,但这本质是不安全的错误写法。
  3. 长度为5的数组触发场景:当数组是完全升序(旋转次数为0)的情况,比如[1,2,3,4,5],循环中的s和e会逐步调整,最终mid会变为0,此时访问arr[mid-1]就会触发索引越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:07:49