python - 查找数组的连续总和

标签 python algorithm

我正在应对编码挑战。挑战基本上是要我找到它的 k 个连续元素的最大总和。这是一个例子:

对于 inputArray = [2, 3, 5, 1, 6]k = 2,输出应该是 arrayMaxConsecutiveSum(inputArray, k) = 8。 2 个连续元素的所有可能的和是:

2 + 3 = 5;
3 + 5 = 8;
5 + 1 = 6;
1 + 6 = 7.

因此,答案是8。

这是我的尝试。我将连续的总和视为子列表。所以如果我有 k=3,那么我必须在 i 之后添加 2 个元素。所以如果开始是索引 0,那么结束就是开始 + k-1。然后我尝试使用 for 循环将每 k 个 block 的总和附加到一个新列表。我的最终目标是从此列表中返回 max():

def arrayMaxConsecutiveSum(inputArray, k):
    begin = 0
    end = begin + (k-1)
    sum_list = []
    
    for i in range(0, len(inputArray)):
        begin = i
        sum_list.append(sum(inputArray[begin:end+1]))
    
    print(sum_list)

现在我只想看看我的 sum_list 是什么样子,然后再尝试返回它的最大值。但是,这是它为测试用例返回的内容:

Input: inputArray: [2, 3, 5, 1, 6]
k: 2
Output: null
Expected Output: 8
Console Output: [5, 3, 0, 0, 0]

我认为我的逻辑是正确的。我只想知道我在哪里犯了错误。

最佳答案

一个相当有效的解决方案是使用 itertools.islicezip用于生成连续元素组。这消除了对列表进行切片的需要

consecutive_elements = zip(*(islice(inputArray, x, None) for x in range(k)))

islice 生成器生成的示例:

>>> [list(islice(range(5), x, None)) for x in range(3)]
[[0, 1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4]]

islice(inputArray, x, None) for x in range(k) 从您的输入中创建可迭代对象,切掉越来越多的元素,然后将其传递给 zip明智地加入可迭代元素创建您的组

然后使用 map 生成总和而不是创建中间列表

return max(map(sum, consecutive_elements))

关于python - 查找数组的连续总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63643211/

相关文章:

用于生成旋律的算法?

c++ - 从 vector 集中修剪非公共(public)元素

python - 带有 flask 的 mod_wsgi 配置

python - 在 python 中,是否可以使用单个命令更新或初始化字典键?

python - argparse 不转换默认数字参数?

python - 如何在os.walk函数中过滤特定路径的文件?

c++ - 有什么办法可以得到 0 - 10 亿之间的随机数吗?

python - 为什么 pytest_generate_tests 钩子(Hook)在定义固定装置时给出 'fixture not found' 错误?

algorithm - 小O是Theta对大O的补集吗

objective-c - 基于 f(N) 生成定价的更好方法