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

