华为OD机试之最大N个数与最小N个数的和

最大N个数与最小N个数的和

题目描述

给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。

说明:

  • 数组中数字范围[0, 1000]
  • 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1
  • 输入非法返回-1

输入描述

  • 第一行输入M, M标识数组大小
  • 第二行输入M个数,标识数组内容
  • 第三行输入N,N表达需要计算的最大、最小N个数

输出描述

输出最大N个数与最小N个数的和

用例

输入

5
95 88 83 64 100
2

输出 342
说明 最大2个数[100,95],最小2个数[83,64], 输出为342。
输入

5
3 2 3 4 2
2

输出 -1
说明 最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1。

解析

典型的逻辑处理题型,需要掌握字符串拆分,排序等知识点。

示例代码Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

//5
//95 88 83 64 100
//2
public class T52 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<Integer> numList = new ArrayList<>();
		int count = Integer.parseInt(sc.nextLine());
		Arrays.stream(sc.nextLine().split(" ")).forEach(s -> {
			if (!numList.contains(Integer.parseInt(s)))
				numList.add(Integer.parseInt(s));
		});

		numList.sort(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				if (o1 > o2)
					return 1;
				if (o1 < o2)
					return -1;
				return 0;
			}
		});
		int num = Integer.parseInt(sc.nextLine());
		List<Integer> num1 = new ArrayList<>();
		num1 = numList.subList(0, num);
		System.out.println(num1);
		boolean flag = false;
		List<Integer> num2 = new ArrayList<>();
		num2 = numList.subList(numList.size() - num, numList.size());
		System.out.println(num2);
		for (int i = 0; i < num1.size(); i++) {
			if (num2.contains(num1.get(i))) {
				System.out.println("-1");
				flag = true;
				break;
			}
		}

		if (!flag) {
			int sum[] = new int[1];
			num1.stream().forEach(s -> {
				sum[0] += s;
			});
			num2.stream().forEach(s -> {
				sum[0] += s;
			});
			System.out.println(sum[0]);
		}

	}
}

代码运行示例

华为OD机试之最大N个数与最小N个数的和_第1张图片

你可能感兴趣的:(华为OD机试,华为od,java,算法)