小U的加法魔法| 豆包MarsCode AI 刷题

63 阅读3分钟

问题描述

小U有一个长度为 nn 的数组,她需要计算这个数组的总和 sum=a1+a2+...+ansum=a1​+a2​+...+an​。小U可以使用一次魔法,将其中一个加号变成乘号,以使得最终的总和最大。

你需要帮小U找到这个最优的方案,计算出最大的可能总和。

解题思路

针对给定长度为 n 的数组 a,在只允许使用一次魔法(将数组中某一对相邻元素间的加号变为乘号)的情况下,找到能使数组元素总和最大的方案,并返回这个最大的可能总和。

  1. 函数定义与初始计算

    • def solution(n: int, a: list) -> int::定义了函数 solution,它接受数组的长度 n 和数组 a 本身作为参数,并返回一个整数,表示经过操作后能得到的最大总和。
    • original_sum = sum(a):首先计算数组 a 的原始总和,即按照正常的加法将数组中所有元素相加得到的值。这个值将作为后续比较的基础。
    • max_sum = original_sum:初始化最大总和 max_sum 为原始总和 original_sum。在后续遍历数组寻找更优方案的过程中,如果找到更大的总和,将会更新这个 max_sum 的值。
  2. 遍历数组寻找最优方案

    • for i in range(n - 1):通过循环遍历数组 a 中的每一对相邻元素。循环的范围是从 0 到 n - 2,因为我们要考虑的是相邻元素,所以最后一个元素不需要单独与后面的元素进行这种操作(后面已经没有元素了)。
    • new_sum = original_sum - a[i] - a[i + 1] + a[i] * a[i + 1]:对于每一对相邻元素 a[i] 和 a[i + 1],这里尝试将它们之间的加号变成乘号来计算一个新的总和 new_sum。计算方式是先从原始总和 original_sum 中减去这两个元素(因为原本是相加的,现在要改变运算方式,所以先去掉这部分相加的值),然后再加上这两个元素相乘的值(即按照改变后的运算方式添加新的值)。
  3. 更新最大总和

    • if new_sum > max_sum::将计算得到的新总和 new_sum 与当前的最大总和 max_sum 进行比较。如果新总和更大,说明找到了一个更优的方案,此时执行 max_sum = new_sum,将最大总和更新为新得到的更大的值。
  4. 返回结果

    • return max_sum:在遍历完数组的所有相邻元素组合并完成比较更新后,返回最终得到的最大总和 max_sum,这个值就是在只使用一次魔法将一个加号变成乘号的情况下,数组能得到的最大可能总和。

完整代码

def solution(n: int, a: list) -> int:
    original_sum = sum(a)
    max_sum = original_sum
    for i in range(n - 1):
        new_sum = original_sum - a[i] - a[i + 1] + a[i] * a[i + 1]
        if new_sum > max_sum:
            max_sum = new_sum
    return max_sum

if __name__ == '__main__':
    print(solution(6, [1, 1, 4, 5, 1, 4]) == 27)
    print(solution(3, [2, 3, 5]) == 17)

测试样例

样例1:

输入:n = 6, a = [1, 1, 4, 5, 1, 4]
输出:27

样例2:

输入:n = 3, a = [2, 3, 5]
输出:17