有多組整數數組,需要將他們合併成一個新的數組。合併規則:從每個數組裏按順序取出固定長度的內容合併到新的數組中,取完的內容會刪除掉,如果該行不足固定長度或者爲空。則直接取出剩餘內容放到新的數組中,繼續下一行。
輸入:第一行是每次讀取的固定長度,第2-n行是需要合併的數組,不同的數組用回車換行分隔,數組內用逗號分隔。
輸出:新的數組,用逗號分隔
示例:
輸入:
3
2,5,6,7
1,7,4
輸出:
2,5,6,1,7,4,7
Java實現的代碼:
考慮到可能整體長度不是固定長度的倍數,因此這個算法稍微複雜了點,題目中也沒有保證輸入的整體數組長度一定是固定長度的倍數,只能說這題太坑,要考慮這種情況
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
// 讀取的長度
String t_Str = sc.nextLine();
if (t_Str.equals("")) {
continue;
}
int t = Integer.parseInt(t_Str);
// 存放每個數組
ArrayList<int[]> list = new ArrayList<>();
// 存放結果
ArrayList<Integer> res = new ArrayList<>();
// 讀取一行信息
while (sc.hasNextLine()) {
String input = sc.nextLine();
if (input.equals("")) {break;}
String[] input_s = input.split(",");
int[] arr = new int[input_s.length];
for (int i = 0;i<arr.length;i++) {
arr[i] = Integer.parseInt(input_s[i]);
}
list.add(arr);
}
if (list.size() > 0) {
// 每個數組當前的讀取位置,初始化爲-1
int[] loc = new int[list.size()];
for (int i=0;i<loc.length;i++) {
loc[i] = -1;
}
// 當前行數
int cur = 0;
int add_t = t;
// 所有的數組讀取完畢才能結束循環
while (true) {
// 取出當前行
int[] arr = list.get(cur);
int curIndex = loc[cur];
// 每次移動的位置是add_t;
if (curIndex + add_t <arr.length) {
curIndex += add_t;
} else {
add_t = t - (arr.length-curIndex-1);
curIndex = arr.length-1;
}
for (int i=loc[cur]+1;i<=curIndex;i++) {
res.add(arr[i]);
}
loc[cur] = curIndex;
// 尋找下一行是哪一行
if (cur == loc.length-1) {
cur = 0;
} else {
cur++;
}
while (loc[cur] == list.get(cur).length-1) {
if (cur == list.size() -1) {
cur = 0;
} else {
cur++;
}
// 遍歷一次看有沒有空行
int index = -1;
for (int i=0;i<list.size();i++) {
if (loc[i] < list.get(i).length-1) {
index = i;
break;
}
}
if (index == -1) {
cur = list.size();
break;
}
}
// 上面的循環找了一圈都沒有空餘元素的時候,則退出,退出的時候,cur必定等於loc.length,此時退出循環
if (cur == list.size()) {
break;
}
}
for (int i=0;i<res.size();i++) {
System.out.print(res.get(i));
if (i < res.size()-1) {
System.out.print(",");
} else {
System.out.println();
}
}
}
}
}
}