Python数组右旋k步代码报错list assignment out of range原因排查
错误原因及修正说明
1. 空列表直接索引赋值触发越界
你初始化的temp是空列表[],在Python里,列表的索引只能访问或修改已经存在的元素位置。空列表没有任何元素,当执行temp[(i+k)%l] = nums[i]时,不管计算出的索引是多少,这个位置在temp里都不存在,直接抛出list assignment out of range错误。
2. 未满足原地修改的要求
就算解决了越界问题,最后一行nums=temp也不符合题目要求:题目明确要求原地修改nums数组,而这行代码只是把函数内部的局部变量nums指向了新列表temp,原传入的数组根本没被修改。
修正方案示例
方案1:基于原思路的临时数组修正
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ l = len(nums) k = k % l # 处理k大于数组长度的情况,减少无效计算 temp = [0] * l # 初始化和nums等长的列表,避免索引越界 for i in range(l): temp[(i + k) % l] = nums[i] nums[:] = temp # 通过切片赋值原地修改原数组
方案2:原地旋转(空间复杂度O(1),更高效)
class Solution: def rotate(self, nums: List[int], k: int) -> None: l = len(nums) k = k % l # 取模处理k超出数组长度的情况 # 定义反转函数 def reverse(start, end): while start < end: nums[start], nums[end] = nums[end], nums[start] start += 1 end -= 1 # 三次反转实现旋转 reverse(0, l - 1) reverse(0, k - 1) reverse(k, l - 1)
内容的提问来源于stack exchange,提问作者Himanshi Muley
相关产品推荐
相关产品推荐

