Python实现2048一维列表合并函数:部分测试用例失败求助
修复2048一维合并函数的问题
你的代码核心问题在于合并状态跟踪逻辑混乱,每次循环末尾强制重置tile_merged为False,导致无法正确控制“每个tile只能合并一次”的规则,同时没有先把非0元素聚拢,而是直接在原列表的遍历中处理,逻辑绕错了方向。
正确的实现思路
2048的行/列合并应该分三步:
- 第一步:过滤掉所有0,把非0元素集中到列表一侧
- 第二步:遍历集中后的列表,合并相邻且相同的元素,每个元素仅合并一次
- 第三步:把合并后的列表补0,恢复到原长度
修正后的代码
def merge(line): """ Function that merges a single row or column in 2048. """ # 第一步:过滤0,收集非0元素 non_zero = [num for num in line if num != 0] merged = [] i = 0 length = len(non_zero) # 第二步:合并相邻相同元素,每个元素仅合并一次 while i < length: if i + 1 < length and non_zero[i] == non_zero[i+1]: merged.append(non_zero[i] * 2) i += 2 # 跳过已合并的下一个元素 else: merged.append(non_zero[i]) i += 1 # 第三步:补0到原列表长度 merged += [0] * (len(line) - len(merged)) return merged # 测试用例验证 print(merge([2,0,2,4])) # 输出 [4,4,0,0] ✅ print(merge([0,0,2,2])) # 输出 [4,0,0,0] ✅ print(merge([2,2,0,0])) # 输出 [4,0,0,0] ✅ print(merge([2,2,2,2,2])) # 输出 [4,4,2,0,0] ✅ print(merge([8,16,16,8])) # 输出 [8,32,8,0] ✅
代码解释
- 过滤非0元素:用列表推导式快速提取所有非0元素,比如
[8,16,16,8]保持不变,[2,0,2,4]会变成[2,2,4]。 - 合并逻辑:用
while循环遍历,当当前元素和下一个元素相等时,合并为两倍值加入结果,同时i加2跳过已合并的元素;若不相等,直接加入当前元素,i加1继续遍历。 - 补0操作:计算原列表与合并后列表的长度差,补充对应数量的0,保证输出长度和输入一致。
这种实现逻辑清晰,完全符合2048的合并规则,所有测试用例都能正确通过。
内容的提问来源于stack exchange,提问作者JoeP
相关产品推荐
相关产品推荐

