一、题目描述
现在有多组整数数组,需要将他们合并成一个新的数组。
合并规则从每个数组里按顺序取出固定长度的内容,合并到新的数组,取完的内容会删除掉。
如果改行不足固定长度,或者已经为空,则直接取出剩余部分的内容放到新的数组中继续下一行。
二、输入描述
第一行,每次读取的固定长度,长度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最大为size
if (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机考。专栏会持续更新,每天在线答疑。