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

102 阅读2分钟

小U的加法魔法

问题描述:

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

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

思路解析:

思路一

最初我以为是可以不按照原先数组顺序,所以我尝试先将数组按照从大到小排序,最后第一项与第二项相乘之后再与其他数字相加。

public class Main {
    public static int solution(int n, int[] a) {
        // 排序数组
        Arrays.sort(a);
        // 反转数组,使其从大到小排列
        for (int i = 0; i < n / 2; i++) {
            int temp = a[i];
            a[i] = a[n - 1 - i];
            a[n - 1 - i] = temp;
        }

        // 计算新的总和
        int sum = a[0] * a[1];
        for (int i = 2; i < n; i++) {
            sum += a[i];
        }

        // 返回总和
        return sum;
    }

    public static void main(String[] args) {
        System.out.println(solution(6, new int[]{1, 1, 4, 5, 1, 4}) == 27);
        System.out.println(solution(3, new int[]{2, 3, 5}) == 17);
    }
}
运行结果

示例显示正确,因为示例中的大数字都是相邻的,所以结果并没有出现误差,但当我提交时却显示错误,并且显示我的运行结果大于正确结果,所以我意识到原来数组顺序是不可以改变的。

思路二

我们可以先计算出不使用乘法的情况,之后再遍历每一种使用乘法的情况与之对比找出最大值。 所以我们先计算数组之和:

for (int num : a) {
    sum += num;
}

再遍历数组所有乘法情况

for (int i = 0; i < n - 1; i++) {
    int newSum = sum - a[i] - a[i + 1] + a[i] * a[i + 1];
    // 更新最大值
    if (newSum > maxSum) {
        maxSum = newSum;
    }
}

最后return maxSum;

运行结果

这次示例和提交都正确。