目录
题目描述
现有多组整数数组,需要将它们合并成一个新的数组。合并规则:从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉;如果该数组不足固定长度或已经为空,则直接取出剩余部分的内容放到新的数组中,继续处理下一个数组。
输入输出描述
输入描述
- 第一行:每次读取的固定长度,满足 长度
- 第二行:整数数组的数目,满足 数目
- 第 3~n 行:需要合并的数组,不同数组用回车换行分隔,数组内部用逗号分隔,每个数组最大不超过 100 个元素。
输出描述
输出合并后的新数组,元素之间用逗号分隔。
用例演示
用例 1
输入
java
3
2
2,5,6,7,9,5,7
1,7,4,3,4
输出
java
2,5,6,1,7,4,7,9,5,3,4,7
用例 2
输入
java
4
3
1,2,3,4,5,6
1,2,3
1,2,3,4
输出
java
1,2,3,4,1,2,3,1,2,3,4,5,6
解题思路
- 数据存储 :将输入的多个数组转换为
List<List<Integer>>结构,便于动态删除已取出的元素。 - 循环取数:持续遍历所有数组,每次从当前数组取出固定长度的元素(不足则取剩余),添加到结果集,并删除原数组中已取出的元素。
- 终止条件:当所有数组都为空时,停止循环,将结果集按格式输出。
Java 代码实现
java
import java.util.*;
public class ArrayMerge {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取固定长度
int k = Integer.parseInt(scanner.nextLine().trim());
// 读取数组数目
int n = Integer.parseInt(scanner.nextLine().trim());
// 存储所有数组(动态列表,便于删除元素)
List<List<Integer>> arrays = new ArrayList<>();
for (int i = 0; i < n; i++) {
String line = scanner.nextLine().trim();
String[] elements = line.split(",");
List<Integer> arr = new ArrayList<>();
for (String e : elements) {
arr.add(Integer.parseInt(e));
}
arrays.add(arr);
}
// 存储最终结果
List<Integer> result = new ArrayList<>();
// 循环取数,直到所有数组为空
boolean hasElement = true;
while (hasElement) {
hasElement = false;
for (List<Integer> arr : arrays) {
if (!arr.isEmpty()) {
hasElement = true;
// 取前k个元素(不足则取全部)
int take = Math.min(k, arr.size());
List<Integer> sub = arr.subList(0, take);
result.addAll(sub);
// 删除已取出的元素
sub.clear();
}
}
}
// 输出结果(逗号分隔)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.size(); i++) {
sb.append(result.get(i));
if (i != result.size() - 1) {
sb.append(",");
}
}
System.out.println(sb.toString());
scanner.close();
}
}
代码解释
- 输入处理 :通过
Scanner逐行读取固定长度k、数组数目n,并将每个数组解析为List<Integer>存入二维列表。 - 核心循环 :通过
while循环持续遍历数组,Math.min(k, arr.size())确定每次取数的长度,subList(0, take)获取子列表并添加到结果集,sub.clear()删除原数组中已取出的元素。 - 结果输出 :通过
StringBuilder拼接结果集元素,按逗号分隔后打印。
总结
本题的核心是动态操作数组元素 和循环遍历取数 ,使用List的动态特性可以高效实现 "取数并删除" 的
