【问题标题】:Loop with i-1 doesn't find correct value使用 i-1 循环找不到正确的值
【发布时间】:2018-10-04 14:38:08
【问题描述】:

任务:

返回数组中数字的总和,对于空数组返回 0。除了数字 13 很不吉利,所以它不算数,紧跟在 13 之后的数字也不算数。

测试样本,预期:

  1. sum13([1, 2, 13, 2, 1, 13]) → 4
  2. sum13([1, 2, 2, 1, 13]) → 6

我的代码产生以下结果:

  #sum13([1, 2, 13, 2, 1, 13]) → 3
  #sum13([1, 2, 2, 1, 13]) → 5

  def sum13(nums):
  s = 0
  if not nums:
    return 0
  for i in range(len(nums)):
    if nums[i]==13 or nums[i-1]==13:
      s += 0
    else:
      s += nums[i]
  return s

为什么它不计算最后 13 num 之前的数字?

更新:

感谢cmets,了解问题。正确如下:

  def sum13(nums):
  s = 0
  if not nums:
    return 0
  for i in range(len(nums)):
    if nums[i]==13 or (nums[i-1]==13 and i-1>=0):
      s += 0
    else:
      s += nums[i]
  return s

【问题讨论】:

  • 第一次迭代中i的值是多少?
  • 理解错误,谢谢!

标签: python-3.x list loops


【解决方案1】:

发生这种情况是因为对于您的第一次循环,i 是-1。

我想你可以试试这个版本,给你你想要的:

def sum13(nums):
    s = 0
    if nums:
        prev = False
        for i in range(len(nums)):
            if not prev and nums[i] != 13:
                s += nums[i]
            prev = nums[i] == 13
    return s

【讨论】:

    【解决方案2】:

    您的循环从 0 索引开始,因此在第一次迭代中,您正在检查 nums[0] == 13 或 nums[-1] == 13(在 python -1 中,索引将为您提供列表的最后一个元素) .所以在这两个测试用例中,条件都是真的,因为最后一个元素是 13,这就是 s 中没有添加 1 的原因。 解决方案是从 1 开始索引。

    【讨论】:

    • @MadPhysicist,我只是想告诉错误输出的原因而不是解决方案......这个想法只是给出建议而不是整个解决方案。我已从评论中删除了解决方案部分。
    • 这仍然是错误的解决方案建议。这很容易测试,如果您的索引从 1 开始,您有 sum13([1, 2, 3]) 返回 5。您的解决方案成功解决了最后一个元素的问题,但现在它忽略了第一个元素!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多