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

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

OD统一考试

分值: 100分

题解: Java / Python / C++

分割数组的最大差值 - 华为OD统一考试_第1张图片

题目描述

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

输入描述

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

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

输出描述

输出差值的最大取值

示例1

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

输出:
10

题解

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

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

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 
#include 
#include 

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;
}

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

你可能感兴趣的:(华为od,java,python,c++,算法,面试,华为机试)