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

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] ✅

代码解释

  1. 过滤非0元素:用列表推导式快速提取所有非0元素,比如[8,16,16,8]保持不变,[2,0,2,4]会变成[2,2,4]。
  2. 合并逻辑:用while循环遍历,当当前元素和下一个元素相等时,合并为两倍值加入结果,同时i加2跳过已合并的元素;若不相等,直接加入当前元素,i加1继续遍历。
  3. 补0操作:计算原列表与合并后列表的长度差,补充对应数量的0,保证输出长度和输入一致。

这种实现逻辑清晰,完全符合2048的合并规则,所有测试用例都能正确通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:13:25