LeetCode Python while循环反转数组 交换逻辑异常问题咨询
数组反转代码异常原因
核心问题出在你修改后的循环赋值逻辑,完全无法实现两个位置的值交换,逐轮拆解执行过程就能清晰看到问题:
两种赋值逻辑的本质区别
正确代码里用的Python多变量赋值写法:
s[left], s[right] = s[right], s[left]
执行时会先把等号右侧的s[right]、s[left]两个原值暂存为临时元组,再依次赋值给左侧的两个索引位置,全程不会出现原值被覆盖的情况,能正常完成交换。
你修改后的顺序赋值写法:
s[left] = s[right] s[right] = s[left]
执行第一步时就会直接把s[left]位置的原有值覆盖掉,等执行第二步赋值时,取到的s[left]已经是刚写入的s[right]原值,相当于把右侧的值复制到左侧后,又把同一个值复制回右侧,两个位置最终存的都是原来s[right]的值,根本没完成交换。
对应你输出结果的执行流程
你能拿到非死循环的输出,说明实际运行的错误版本里保留了原代码的指针移动逻辑(left = left + 1、right = right -1),逐轮执行过程完全匹配你的输出结果:
- 初始状态:输入数组
s=["h","e","l","l","o"],left=0,right=4 - 第一轮循环(left=0 < right=4,满足条件):
- 执行
s[left] = s[right]:把索引4位置的"o"赋值给索引0,原索引0存储的"h"被直接覆盖丢失,数组变为["o","e","l","l","o"] - 执行
s[right] = s[left]:此时索引0位置已经是"o",赋值后索引4位置也为"o",数组无变化 - 指针移动:left自增为1,right自减为3
- 执行
- 第二轮循环(left=1 < right=3,满足条件):
- 执行
s[left] = s[right]:把索引3位置的"l"赋值给索引1,原索引1存储的"e"被覆盖丢失,数组变为["o","l","l","l","o"] - 执行
s[right] = s[left]:此时索引1位置已经是"l",赋值后索引3位置也为"l",数组无变化 - 指针移动:left自增为2,right自减为2
- 执行
- 此时
left < right条件不成立,循环退出,最终输出就是你得到的["o","l","l","l","o"]
注:如果你贴出的错误代码是完整版本(没有写指针移动逻辑),运行时会陷入死循环,因为left和right的值永远不变,循环判断条件永远成立。
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

