求数组的连续和

2024-06-28 10:59:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在经历一个编码挑战。这个挑战主要是要我找到它的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个块的总和附加到一个新列表中。我的最终目标是从这个列表中返回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]

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


Tags: 答案元素编码列表foroutputlist例子
3条回答

在这种情况下,取给定索引到索引+k的总和(5-(k-1))次,取最大值

inputArray = [2, 3, 5, 1, 6]
k = 3
print(max([sum(inputArray[idx : idx + k]) for idx in range(len(inputArray)-(k-1))])) 

如果您想要更具可读性且不使用任何其他库(如itertools),您可以尝试使用以下一行程序-

[sum(i) for i in zip(*(inputArray[i:] for i in range(k)))]
[5, 8, 6, 7]

调试代码:

代码中有一些错误。首先,定义循环外部的端点。当开始更改时,您希望循环中的结束也更改。另外,由于python已经考虑了end的n-1索引,所以只需要将其设置为begin+k而不是begin+(k-1)。接下来,您需要将迭代器从0移动到length或array-1,因为最后一项只是一个元素。如果您想知道哪里出了问题,我已经修改了代码,使其按照您的预期运行-

def arrayMaxConsecutiveSum(inputArray, k):
    #begin = 0 #<--- #No need since you are setting it to i in loop
    #end = begin + k #<--- Not to be defined here but inside loop
    sum_list = []
    
    for i in range(0, len(inputArray)-1): #<----
        begin = i
        end = begin + k #<--- 
        sum_list.append(sum(inputArray[begin:end])) #<----
    
    print(sum_list)
[5, 8, 6, 7]

一个相当有效的解决方案是使用^{}^{}生成连续元素的组。这样就不需要对列表进行切片

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)从您的输入中创建iterables,该输入会切掉越来越多的元素,将其传递给zip,然后在创建组时加入iterables元素

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

return max(map(sum, consecutive_elements))

相关问题 更多 >