> 文章列表 > 华为OD机试真题(Java),数组合并(100%通过+复盘思路)

华为OD机试真题(Java),数组合并(100%通过+复盘思路)

华为OD机试真题(Java),数组合并(100%通过+复盘思路)

在这里插入图片描述

一、题目描述

现在有多组整数数组,需要将他们合并成一个新的数组。
合并规则从每个数组里按顺序取出固定长度的内容,合并到新的数组,取完的内容会删除掉。
如果改行不足固定长度,或者已经为空,则直接取出剩余部分的内容放到新的数组中继续下一行。

二、输入描述

第一行,每次读取的固定长度,长度0<len<10;
第二行是整数数组的数目,数目 0<num<10000;
第3~n行是需要合并的数组,不同的数组用换行分割,元素之间用逗号分割,最大不超过100个元素。

三、输出描述

输出一个新的数组,用逗号分割。

四、Java算法源码

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int len = scanner.nextInt(); // 行每次读取的固定长度int num = scanner.nextInt(); // 整数数组的数目String s = scanner.nextLine(); // nextInt后有空行,先读取一次List<List<String>> arrays = new ArrayList<>(num);int maxArrayLen = 0;int totalLen = 0;for (int i = 0; i < num; i++) {List<String> array = Arrays.stream(scanner.nextLine().split(",")).collect(Collectors.toList());arrays.add(array);totalLen += array.size();maxArrayLen = Math.max(maxArrayLen, array.size());}// 计算每个数组最多需要截取几次,即遍历次数int cycle;if (maxArrayLen % len == 0) {cycle = maxArrayLen / len;} else {cycle = maxArrayLen / len + 1;}// 拼接结果数组List<String> results = new ArrayList<>(totalLen);int start;int end;for (int i = 0; i < cycle; i++) {for (List<String> array : arrays) {start = i * len;end = (i + 1) * len;int size = array.size();// 如果开始index已经大于数组最大,说明该数组取完了if (start > size - 1) {continue;}// 结束index最大为sizeif (end > size) {end = size;}// 取指定长度的子数组results.addAll(array.subList(start, end));}}System.out.println(String.join(",", results));
}

五、效果展示

输入:

3
2
2,5,6,7,9,5,7
1,7,4,3,4

输出:

2,5,6,1,7,4,7,9,5,3,4,7

说明:

获得长度3和数组数目2
先遍历第一行 获得2,5,6
再遍历第二行 获得1,7,4
再循环回到第一行获得7,9,5
再遍历第二行获得3,4
再回到第一行获得7

在这里插入图片描述

🏆本文收录于,华为OD机试2023(Java)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述