Python3数组左旋转代码异常,求错误原因及修复方案
嘿,我来帮你排查下这个数组左旋转的问题~
核心问题分析
你的代码里最关键的bug出在这一行:
b = a
在Python中,列表是可变对象,这个赋值操作并不会创建一个新的列表副本,而是让变量b和a指向同一个内存地址的列表。也就是说,你后续修改b的元素时,其实是在直接修改原列表a的内容。
举个具体的例子:第一次循环i=0时,你把a[0](也就是12)赋值给b的某个位置,但因为b和a是同一个列表,这就相当于把a的对应位置改成了12。等到循环到i=1、i=2的时候,a[i]已经被之前的操作改成12了,最后整个列表自然就全被12填满了。
修复方案
我给你两种实用的修复思路,任选其一都能解决问题:
方法1:创建独立的新列表
不要直接赋值b = a,而是创建一个和原列表长度相同的新列表,这样修改b就不会影响原列表a了:
def rotLeft(a, d): lengthOfArray = len(a) shift = d # 创建一个与原列表长度一致的新列表,后续会覆盖初始值 b = [0] * lengthOfArray for i in range(lengthOfArray): newLocation = (i + (lengthOfArray - shift)) % lengthOfArray b[newLocation] = a[i] return b
方法2:利用Python切片特性(更简洁高效)
Python的列表切片可以非常优雅地实现左旋转逻辑,完全不需要手动写循环:
def rotLeft(a, d): # 先处理旋转次数大于数组长度的情况,避免多余操作 shift = d % len(a) # 左旋转d次 = 把前d个元素移到列表末尾 return a[shift:] + a[:shift]
比如你的测试用例,数组是[12,76,1,9,13],d=4的话,a[4:]取到[13],a[:4]取到[12,76,1,9],拼接后就是[13,12,76,1,9],这正是左旋转4次的正确结果。
测试验证
用你提供的输入测试(注意输入里的09应该写成9,因为Python整数不支持前导零):
输入:5 4 12 76 1 9 13
运行修复后的代码,输出会是[13, 12, 76, 1, 9],完全符合预期。
内容的提问来源于stack exchange,提问作者Ajay Singh
相关产品推荐
相关产品推荐

