1、题目描述
给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和,需要对数组进行去重。
说明:
● 数组中数字范围[0, 1000]
● 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1
● 输入非法返回-1
2、输入描述
● 第一行输入M, M表示数组大小
● 第二行输入M个数,表示数组内容
● 第三行输入N,N表示需要计算的最大、最小N个数
3、输出描述
输出最大N个数与最小N个数的和。
用例:
输入
5
95 88 83 64 100
2输出
342ps:
最大2个数[100,95],最小2个数[83,64], 输出为342
用例:
输入
5
3 2 3 4 2
2输出
-1ps:
最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1
温馨提示!!!
华为OD机试考试官方会对考生代码查重。华为od机试因为有题库所以有很大的概率抽到原题。如果碰到了题库中的原题,千万不要直接使用题解中的代码,一定要做些修改,比如代码中的变量名,除此之外,代码的组织结构和逻辑也要进行一些改变,所以在日常的刷题中,要提前编写好属于自己的代码。
4、题解
本题简单,排序后遍历分别取最大与最小的n个数求和即可。
代码如下:
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = Integer.parseInt(sc.nextLine());int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();int n = Integer.parseInt(sc.nextLine());List<Integer> arrList = new ArrayList<>();for (int i : arr) {if (!arrList.contains(i)) {arrList.add(i);}}// 排序Collections.sort(arrList);int len = arrList.size();// 若存在重合则输出-1if (n + n > len) {System.out.println(-1);}else {int min = 0;int max = 0;for (int i=0; i<n; i++) {min += arrList.get(i);}for (int i=len-1; i>len-n-1; i--) {max += arrList.get(i);}//System.out.println(min);//System.out.println(max);System.out.println(min + max);}
}
执行结果如下: