如何解决Python数组旋转索引代码中的索引越界错误?
问题分析
原代码出现索引越界的原因有两个:
- 未处理数组长度为0或1的边界情况,此时
i=1会直接访问超出数组范围的索引。 - 循环条件逻辑错误:
while arr[i]>arr[i-1] and i<n-1不仅会漏掉对最后一组相邻元素的检查,还可能在n=2这类场景下导致判断错误;同时条件顺序未优先判断索引合法性,存在越界风险。
修复方案
1. 先处理边界情况
在arrayRotateCheck函数开头,先判断数组长度n是否小于等于1,这种情况下直接返回0(空数组或单个元素数组无需旋转)。
2. 修正循环条件和终止判断
- 将循环条件改为
while i < n and arr[i] > arr[i-1],优先判断索引i是否在合法范围内(利用逻辑与的短路特性,避免越界),同时遍历到数组最后一个元素,确保不会漏掉任何一组相邻元素的检查。 - 循环结束后,判断
i是否等于n:如果等于,说明整个数组是严格递增的,返回0;否则返回i(即旋转点的索引)。
修复后的完整代码
from sys import stdin def arrayRotateCheck(arr, n): # 处理边界情况:空数组或单个元素数组 if n <= 1: return 0 i = 1 # 优先判断索引合法性,再比较元素大小 while i < n and arr[i] > arr[i-1]: i += 1 # 遍历完所有元素都满足递增,说明未旋转 if i == n: return 0 else: return i # Taking Input Using Fast I/O def takeInput() : n = int(stdin.readline().rstrip()) if n == 0: return list(), 0 arr = list(map(int, stdin.readline().rstrip().split(" "))) return arr, n # main t = int(stdin.readline().rstrip()) while t > 0 : arr, n = takeInput() print(arrayRotateCheck(arr, n)) t -= 1
验证案例
- 测试案例1:输入数组
[3,4,5,1,2],返回3(正确,旋转点在索引3处)。 - 测试案例2:输入数组
[1,2,3,4],返回0(正确,数组未旋转)。 - 测试案例3:输入数组
[2,1],返回1(正确,旋转点在索引1处)。 - 测试案例4:输入数组
[5],返回0(正确,单个元素无需旋转)。 - 测试案例5:输入空数组,返回
0(正确)。
内容的提问来源于stack exchange,提问作者hsrh
相关产品推荐
相关产品推荐

