You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从数组两端选取B个元素求最大和的Python代码错误排查求助

代码错误排查与修复

首先,咱们来看看你的代码为什么会得到错误结果6,而不是正确的8。

核心错误分析

你的思路方向是对的——先算全选左端B个元素的和,再逐步替换左端元素为右端元素,每次取最大值。但有两个关键错误拖了后腿:

  1. 初始索引选反了
    你把左指针i初始设为0,这意味着每次替换的是最左边的左端元素,而正确的逻辑应该是从最右边的左端元素开始替换(这样才能覆盖所有「左k个+右(B-k)个」的组合)。
  2. 指针完全没更新
    循环里你没有移动i和j,导致每次都在减同一个左端元素(A[0])、加同一个右端元素(A[4]),根本没遍历到正确的组合。

修复后的代码

调整索引初始值,并在循环中更新指针,就能得到正确结果:

def solve(A, B):
    n = len(A)
    # 初始计算前B个元素的和
    current_sum = sum(A[:B])
    max_sum = current_sum
    
    # 从最右边的左端元素开始,逐个替换成右端元素
    left_idx = B - 1
    right_idx = n - 1
    
    for _ in range(B):
        # 去掉当前最右边的左端元素,加上当前右端元素
        current_sum -= A[left_idx]
        current_sum += A[right_idx]
        # 更新最大值
        max_sum = max(max_sum, current_sum)
        # 移动指针,处理下一组替换
        left_idx -= 1
        right_idx -= 1
    
    return max_sum

测试示例验证

用你的测试输入A = [5, -2, 3, 1, 2],B = 3运行修复后的代码:

  1. 初始current_sum是前3个元素的和:5 + (-2) + 3 = 6,max_sum = 6
  2. 第一次循环:去掉A[2](3),加上A[4](2),current_sum = 6 - 3 + 2 = 5,max_sum保持6
  3. 第二次循环:去掉A[1](-2),加上A[3](1),current_sum = 5 - (-2) + 1 = 8,max_sum更新为8
  4. 第三次循环:去掉A[0](5),加上A[2](3),current_sum = 8 - 5 + 3 = 6,max_sum保持8

最终返回8,和预期结果完全一致。

另一种更直观的实现方式

如果想让逻辑更清晰,也可以用前缀和+后缀和的方式,遍历所有可能的组合:

def solve(A, B):
    n = len(A)
    # 前缀和:prefix[k]是前k个元素的和(k从0到B)
    prefix = [0] * (B + 1)
    for k in range(1, B+1):
        prefix[k] = prefix[k-1] + A[k-1]
    
    # 后缀和:suffix[m]是后m个元素的和(m从0到B)
    suffix = [0] * (B + 1)
    for m in range(1, B+1):
        suffix[m] = suffix[m-1] + A[n - m]
    
    # 遍历所有左k+右(B-k)的组合,取最大值
    max_sum = 0
    for k in range(B+1):
        current = prefix[k] + suffix[B - k]
        if current > max_sum:
            max_sum = current
    return max_sum

这种方式可读性更强,也不容易出错,适合用来理解底层逻辑。

内容的提问来源于stack exchange,提问作者Maws

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:22:44