找到第一个索引,其中元素之和大于元素本身

时间:2017-11-23 22:36:54

标签: python python-3.x

我必须找到第一个索引,其中直到该索引的元素总和(本身不包括)大于元素本身。如果没有这样的元素只返回-1。 我的代码:

def bigger_sum(numbers):
    tmp_var = 0
    for i in range(len(numbers)):
        tmp_var += numbers[i]
        if tmp_var > numbers[i]:
            return i
        return -1

[1, 2, 3, 4] => 3
[1, 2, 3] => -1
[1, 2] => -1

我只在最后两个列表-1上得到了正确的输出,但如果我尝试第一个列表,则输出为空。代码有什么问题?

4 个答案:

答案 0 :(得分:2)

首先,只有在遍历整个列表而不是针对每个索引进行迭代时,才能减少return -1的缩进级别。

如果您这样做,您的代码将如下所示:

def bigger_sum(numbers):
    tmp_var = 0
    for i in range(len(numbers)):
        tmp_var += numbers[i]
        if tmp_var > numbers[i]:
            return i
    return -1

您的代码现在将为所有测试用例返回1,因为if条件在循环的第二次迭代中始终为true。 你能明白为什么吗?

要解决此问题过早增加temp_value,请将tmp_var += numbers[i]行移至for循环块的底部:

def bigger_sum(numbers):
  tmp_var = 0
  for i in range(len(numbers)):
    if tmp_var > numbers[i]:
      return i
    tmp_var += numbers[i]
  return -1

print(bigger_sum([1, 2, 3, 4])) # 3
print(bigger_sum([1, 2, 3])) # -1
print(bigger_sum([1, 2])) # -1

答案 1 :(得分:2)

您违反了自己未包含的""在检查tmp_var之前添加到tmp_var > numbers[i]的规则。

此外,您-1时第一次从函数返回tmp_var <= numbers[i]。你需要在循环后返回语句

def bigger_sum(numbers):
    tmp_var = 0
    for i, item in enumerate(numbers):
        if tmp_var > item:
            return i
        tmp_var += item
    return -1

print(bigger_sum([1, 2, 3, 4])) # 3
print(bigger_sum([1, 2, 3])) # -1
print(bigger_sum([1, 2])) # -1

我允许自己使用enumerate增强您的代码,因为range(len(numbers))是一种暴行。

答案 2 :(得分:1)

根据描述你需要考虑直到该指数的元素总和(本身不包括在内),这意味着你不应该在总和中包含当前指数的值以前的元素。

以下是如何更改代码:

def bigger_sum(numbers):
    tmp_var = 0
    for i in range(len(numbers)-1):
        tmp_var += numbers[i]
        # Compare the sum of elements 
        # up to this index, to the next index 
        if tmp_var > numbers[i+1]:
            return i+1
    return -1

答案 3 :(得分:1)

您的代码存在两个问题:

  1. 增量应在比较后发生(根据您自己声明的规则)。
  2. return -1行应该在循环外发生。这可能只是你的错字。
  3. 您可以完全删除循环并使用itertools.accumulate编写单行来生成运行总和:

    from itertools import accumulate
    
    next((i for i, (n, s) in enumerate(zip(numbers, accumulate(numbers))) if 2 * n < s), -1)
    

    我在这里使用2 * n因为正在运行的总和s包含当前元素n。测试n < s - n与测试2 * n < s相同。

    -1的返回值由next的默认参数提供。

    IDEOne link