我正在研究一个 Python 函数,该函数将数组作为输入并返回紧跟在负元素之后的正元素的最大总和:
def some(arr):
som = 0
startSum = False
ta = []
for i in range(len(arr)):
if arr[i] < 0:
som = 0
startSum = True
elif startSum == True:
som += arr[i]
ta.append(som)
if len(ta) == 0:
return 0
return max(ta)
比如我输入数组
[1, -2]
,函数返回0
,但是正确的输出应该是-1
.
如何修改我的函数以正确处理这种情况?
看完大家的评论,这个功能怎么样?
def some(arr):
count = sum(num < 0 for num in arr)
if count == 0:
return 0
if count == 1:
return -1
som = 0
startSum = False
for i in range(len(arr)):
if arr[i] < 0:
if startSum:
return som
startSum = True
elif startSum == True:
som += arr[i]
return som
基本上我首先计算有多少负数存在,并根据计数返回值
1 negative => return -1
0 negatives => return 0
否则用您提供的代码稍作修改返回总和
if arr[i] < 0:
if startSum:
return som
startSum = True
所以如果你在列表中找到另一个负数,你会停止并返回你得到的总和,直到那个数字
请记住,您可以通过不运行 for 循环并直接使用 sum 方法来实现相同的效果,如下所示:
def some(arr):
count = sum(num < 0 for num in arr)
if count == 0:
return 0
if count == 1:
return -1
# We find the first negative number and doing +1 to get the number after that one
start_index = arr.index(next(num for num in arr if num < 0)) + 1
# we find the next negative number after the above one, otherwise we return len(arr)
end_index = arr.index(next((num for num in arr[start_index:] if num < 0), len(arr)))
# return the sum of the array containing only the numbers in the middle
return sum(arr[start_index:end_index])
在最后一条评论后编辑(我们计算负数后数字的最大总和并返回该总和的版本):
def some(arr):
count = sum(num < 0 for num in arr)
if count == 0:
return 0
if count == 1:
return -1
max_sum = float('-inf')
start_index = 0
for i in range(len(arr)):
if arr[i] < 0:
max_sum = max(max_sum, sum(arr[start_index:i]))
start_index = i + 1
max_sum = max(max_sum, sum(arr[start_index:]))
return max_sum if max_sum != float('-inf') else 0