题目描述
现在有多组整数数组,需要将他们合并成一个新的数组。
合并规则从每个数组里按顺序取出固定长度的内容,合并到新的数组,取完的内容会删除掉。
如果改行不足固定长度,或者已经为空,则直接取出剩余部分的内容放到新的数组中继续下一行。
输入描述
第一 行每次读取的固定长度
长度0<len<10
第二行是整数数组的数目
数目 0<num<10000
第3~n行是需要合并的数组
不同的数组用换行分割
元素之间用逗号分割
最大不超过100个元素。
输出描述
输出一个新的数组,用逗号分割。
示例1
输入
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
示例2
输入
4
3
1,2,3,4,5,6
1,2,3
1,2,3,4
输出
1,2,3,4,1,2,3,1,2,3,4,5,6
思路分析
- 数组合并,长度可变,Java中可以使用List进行处理。
参考代码
注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
/**
* 数组合并
*/
public class Test0022 {
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));
}
}