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

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"]举例:

  1. 第一轮i=0时,交换B和G,列表变成["G", "B", "G"]
  2. 接着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))

代码说明

  1. 用while循环代替for循环遍历列表,这样能灵活控制遍历的步长,避免连续处理
  2. 每次交换后i += 2,直接跳过刚交换后的下一个位置,确保同一轮里这个B不会再移动
  3. 修正了输入逻辑:原题输入是先给n和t,再给一个长度为n的B/G字符串,用list(input().strip())获取元素更准确

技能提升建议

  • 抠题细节:这类模拟题的核心是严格贴合题目规则,一定要把"每轮操作"的定义吃透,比如本题的关键是同一轮内B不能连续移动
  • 手动模拟调试:遇到输出不符时,拿小例子手动走一遍代码流程,对比每一步的列表变化,很快就能找到哪里错了
  • 遍历方式选择:当需要调整遍历步长时,while比for更灵活,for循环的固定步长容易导致逻辑漏洞
  • 输入逻辑对齐原题:写代码前先确认输入格式,比如原题的队列是字符串输入,不要自己硬写测试列表,避免和题目要求脱节

内容的提问来源于stack exchange,提问作者Hamza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:41