Python中for循环实现单次相邻B-G交换失效问题求助
问题解决与代码修正
问题描述
我有一个元素为'B'和'G'的列表,长度未知,需要执行time轮操作:每一轮里,仅处理相邻的'B'后跟'G'的交换,但同一轮中,刚交换过来的'B'不能立刻和它后面的'G'再次交换。比如初始列表["B", "G", "G", "B", "G"],经过1轮后预期输出是["G", "B", "G", "G", "B"],但我的代码跑出来是['G', 'G', 'B', 'G', 'B']。
错误原因
你的代码在每一轮的for循环里会遍历所有相邻元素对,交换后还继续向后走,导致同一轮内连续交换。比如拿["B", "G", "G"]举例:
- 第一轮i=0时,交换B和G,列表变成
["G", "B", "G"] - 接着i=1时,又触发B和G的交换,列表直接变成
["G", "G", "B"]
这就违反了每轮的操作规则,相当于同一轮里让B连续移动了两次。
修正后的代码
核心思路是:每一轮遍历的时候,一旦发生交换,就跳过下一个元素,避免刚交换过来的B被重复处理。
# 读取输入:第一个数是队列长度,第二个数是要执行的轮次 queue_time = list(map(int, input().split())) time = queue_time[-1] # 读取队列元素(输入为一个由B和G组成的字符串) persons = list(input().strip()) while time > 0: i = 0 while i < len(persons) - 1: if persons[i] == "B" and persons[i+1] == "G": # 交换相邻的B和G persons[i], persons[i+1] = persons[i+1], persons[i] # 跳过下一个位置,避免本轮重复处理刚移动过来的B i += 2 else: i += 1 time -= 1 # 把列表转为字符串输出,更贴合题目要求 print(''.join(persons))
代码说明
- 用
while循环代替for循环遍历列表,这样能灵活控制遍历的步长,避免连续处理 - 每次交换后
i += 2,直接跳过刚交换后的下一个位置,确保同一轮里这个B不会再移动 - 修正了输入逻辑:原题输入是先给n和t,再给一个长度为n的B/G字符串,用
list(input().strip())获取元素更准确
技能提升建议
- 抠题细节:这类模拟题的核心是严格贴合题目规则,一定要把"每轮操作"的定义吃透,比如本题的关键是同一轮内B不能连续移动
- 手动模拟调试:遇到输出不符时,拿小例子手动走一遍代码流程,对比每一步的列表变化,很快就能找到哪里错了
- 遍历方式选择:当需要调整遍历步长时,
while比for更灵活,for循环的固定步长容易导致逻辑漏洞 - 输入逻辑对齐原题:写代码前先确认输入格式,比如原题的队列是字符串输入,不要自己硬写测试列表,避免和题目要求脱节
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

