Advent of Code 2021 Day6 灯笼鱼问题deque实现结果异常调试求助
调试建议与问题根源
快速调试步骤
- 先实现最简分组版本验证逻辑:直接用长度为9的数组存储计时器0~8对应的鱼的数量,更新逻辑如下:
这个版本逻辑极简几乎不会出错,先跑通测试用例,再对照你的现有实现逐一比对差异,定位效率最高。def count_lanternfish(initial, days): counts = [0]*9 for n in initial: counts[n] += 1 for _ in range(days): zero = counts.pop(0) counts[6] += zero # 繁殖的鱼重置计时器为6 counts.append(zero) # 新生鱼计时器为8 return sum(counts) # 测试用例验证 print(count_lanternfish([3,4,3,1,2], 18)) # 输出26 print(count_lanternfish([3,4,3,1,2], 80)) # 输出5934 - 逐天对齐统计结果:你日志中第17天总鱼数就已经达到26(对应正确的18天结果),说明初始天数存在1天的偏移,你的初始状态直接将
day设为1,而题目初始状态是第0天,需要先对齐天数基准。 - 核对计数逻辑:你当前代码的核心bug是重复计数:
update方法中将pool_2_update位置的鱼的数量放入孵化池时,没有从原位置减去对应的数值,相当于这批鱼同时被算在成鱼池和孵化池中,越往后总数量偏差越大。 - 简化移位逻辑:用
deque存储所有9个计时器的计数,直接用popleft+append实现移位,比模运算更直观,不易出现索引错位问题。
核心问题修正方向
你拆分孵化池和成鱼池的思路本身是成立的,但需要调整更新顺序:
- 每天先取出成鱼池索引0位置的鱼的数量(计时器到0需要繁殖的鱼)
- 将该数量加入孵化池,同时将该数量加回成鱼池索引6的位置(原鱼重置计时器)
- 取出孵化池最早的一批鱼,加入成鱼池索引6的位置(孵化完成的鱼进入繁殖周期)
- 总数量为成鱼池总和加孵化池总和,不会出现重复计数。
内容的提问来源于stack exchange,提问作者N3buchadnezzar
相关产品推荐
相关产品推荐

