分割数组的最大差值 - 华为OD统一考试

news/2024/7/20 18:55:45 标签: 华为od, java, python, c++, 算法, 面试, 华为机试

分割数组的最大差值 - 华为OD统一考试

OD统一考试

分值: 100分

题解: Java / Python / C++

alt

题目描述

给定一个由若干整数组成的数组nums ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值.计算这两个值的差值,请输出所有分割方案中,差值最大的值。

输入描述

第一行输入数组Q中元素个数n,1< n < 100000

第二行输入数字序列,以空格进行分隔,数字取值为4字节整数

输出描述

输出差值的最大取值

示例1

输入:
6
1 -2 3 4 -9 7

输出:
10

题解

简单模拟题,需要小心的是数据范围。

Java

java">import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int[] nums = new int[n];
        long sum = 0;

        for (int i = 0; i < n; i++) {
            int num = scanner.nextInt();
            sum += num;
            nums[i] = num;
        }

        long maxAbs = 0, leftSum = 0;
        for (int i = 0; i < n - 1; i++) {
            leftSum += nums[i];

            // rightSum = sum - leftSum, 差值 = rightSum - leftSum = Math.abs(sum - leftSum)
            maxAbs = Math.max(maxAbs, Math.abs(sum - 2 * leftSum));
        }

        System.out.println(maxAbs);
    }
}

Python

python">n = int(input())
nums = list(map(int, input().split()))

sum_val,max_abs,left_sum = sum(nums),0,0

for i in range(n - 1):
    left_sum += nums[i]
    # right_sum = sum - left_sum, 差值 = right_sum - left_sum = abs(sum - left_sum)
    max_abs = max(max_abs, abs(sum_val - 2 * left_sum))

print(max_abs)

C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    long long sum = 0;
    int n, num;
    cin >> n;
    vector<int> nums(n);
    for(int i=0; i<n; i++) {
        cin >> num;
        sum += num;
        nums[i] = num;
    }

    long long max_abs = 0, left_sum = 0;
    for(int i=0; i<n-1; i++) {
        left_sum += nums[i];

        // right_sum = sum - left_sum,  差值 = right_sum - left_sum = abs(sum - left_sum)
        max_abs = max(max_abs, abs(sum - 2 * left_sum));
    }

    cout << max_abs << endl;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏


http://www.niftyadmin.cn/n/5297408.html

相关文章

FileZilla的使用,主动模式和被动模式思维导图

注&#xff1a;图片 &#xff08;与上面的思维导图文字配图看&#xff09;

在Mac上恢复SD卡数据的 6 个有效应用程序

慌&#xff01;SD卡里的照片和视频不小心删了&#xff0c;Mac设备上还恢复不了数据&#xff01; 遇到这种情况&#xff0c;你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表&#xff0c;并且还有详细的评论。另外&#xff0c;我们还会给…

【排序算法】合并两个有序数组

合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&…

模型 KANO卡诺模型

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅&#xff0c;你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈&#xff0c;并分析客户的…

配置打开QT designer

要在PyCharm中配置打开Qt Designer的外部工具&#xff0c;可以遵循以下步骤。这个配置将允许你直接从PyCharm打开Qt Designer&#xff0c;编辑.ui文件。 打开PyCharm的设置: 选择File > Settings&#xff08;在macOS上是PyCharm > Preferences&#xff09;。 导航到外部…

【实用工具】vim常用命令

快速移动(上下左右箭头可替代) 左移 h 右移 l 下移 j 上移 K在本行操作 0 移动到本行行首 ^ 移动到本行的第一个不是 blank 字符 $ 移动到本行行尾 w 光标移动到下一个单词的开头 e 光标移动到下一个单词的结尾跨行移动光标 nG 光标定位到第n行的行首 gg 光标定位到第一行的…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

五.共享内存

目录 1 共享内存概述 特点和优势 Linux 中的共享内存 使用场景 1.1共享内存的特点 2 共享内存操作 2.1 获得一个共享存储标识符 2.2 共享内存映射(attach) 2.3 解除共享内存映射(detach) 2.4 案例&#xff1a;使用共享内存实现读写操作 3 共享内存的控制 1 共享内存概…