关于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
相关产品推荐
相关产品推荐

