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

关于CodingBat中sum13 Python练习题的解答疑问

解答CodingBat的sum13练习题疑惑

先再明确下题目要求,避免理解偏差:

返回数组中数字的总和,空数组返回0。但数字13为不吉利数字,它本身不计入总和,且紧跟在13之后的数字也不计入总和。
示例:

  • sum13([1, 2, 2, 1]) → 6
  • sum13([1, 1]) → 2
  • sum13([1, 2, 2, 1, 13]) → 6

你提到的那段示例代码只写了一半,估计是想通过修改数组元素来实现,但其实这种思路有点绕,不如用更直观的方法。我先给你补全两种常见的正确解法,再逐一解释:

方法一:用标记位跳过元素(最直观)

def sum13(nums):
    total = 0
    skip_next = False  # 标记是否需要跳过下一个元素
    for num in nums:
        if skip_next:
            # 上一个元素是13,当前元素直接跳过
            skip_next = False
            continue
        if num == 13:
            # 当前是13,自己不计入,还要标记跳过下一个
            skip_next = True
            continue
        # 正常累加
        total += num
    return total

方法二:基于索引判断(对应你看到的那段代码的思路)

def sum13(nums):
    if len(nums) == 0:
        return 0
    total = 0
    length = len(nums)
    for i in range(length):
        if nums[i] == 13:
            # 当前元素是13,直接跳过
            continue
        # 检查前一个元素是不是13,如果是,当前元素也跳过
        if i > 0 and nums[i-1] == 13:
            continue
        total += nums[i]
    return total

思路拆解

  • 方法一的核心是用skip_next这个开关:遇到13就打开开关,下一个元素过来时就跳过并关闭开关,逻辑很清晰,不容易出错。
  • 方法二是通过索引检查当前元素的前一个是否是13,这种写法适合习惯用索引遍历的场景,需要注意边界(比如i=0的时候不能检查i-1)。

你看到的那段不完整代码里if i+1 < l...应该是想把13后面的元素设为0,但这种修改原数组的做法没必要,而且如果数组本身就有0的话,会混淆逻辑,不如上面两种方法干净。

我们拿示例sum13([1,2,2,1,13])测试下:

  • 前四个元素1、2、2、1都正常累加,总和到6
  • 最后一个元素是13,直接跳过,最终返回6,完全符合要求

再试个特殊情况sum13([13, 5, 13, 10]):

  • 第一个13跳过,标记跳过下一个,所以5也跳过
  • 第二个13跳过,标记跳过下一个,10也跳过
  • 最终总和是0,正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:31:57