華爲社招算法題

有多組整數數組,需要將他們合併成一個新的數組。合併規則:從每個數組裏按順序取出固定長度的內容合併到新的數組中,取完的內容會刪除掉,如果該行不足固定長度或者爲空。則直接取出剩餘內容放到新的數組中,繼續下一行。

輸入:第一行是每次讀取的固定長度,第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();
                    }
                }
            }

        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章