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

如何解决Python数组旋转索引代码中的索引越界错误?

问题分析

原代码出现索引越界的原因有两个:

  1. 未处理数组长度为0或1的边界情况,此时i=1会直接访问超出数组范围的索引。
  2. 循环条件逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:23:11