2017搜狐筆試題(Java實現)

頭像是我偶像發表於2017-08-28

一、生成Kolakoski序列


1.1 題目描述:

Kolakoski序列是個自主生成的無限序列。

例如,當給定的整陣列為[1, 2]時,Kolakoski序列是這樣的:

[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, …]

如果我們將相鄰的相同的數字分成一組,那麼將會得到:

[[1], [2, 2], [1, 1], [2], [1], [2, 2], [1], [2, 2], [1, 1], [2], [1, 1], [2, 2], [1], [2], [1, 1], [2], [1], [2, 2], [1, 1],…]

可以看出,每組數字交替由1, 2組成。

接下來對每個分組求他的長度,得到:

[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, …]

可以看出,經過如上的變換後,數列保持不變。

對於其他給定的整陣列,同樣可以用類似的方法構造Kolakoski序列,例如給定整陣列[2, 3]時:

[2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3,…]

給定整陣列[2, 1, 3, 1]時,構造得到如下:

[2, 2, 1, 1, 3, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1,…]


1.2 輸入描述:

輸入由兩行組成:

第一行包括兩個正整數n, m

第二行包括m個正整數a[]

資料規模與限制:

0<n<10000

1<m<1000

0<a[i]<1000

a[i]不等於a[i+1]

a[0]不等於a[m-1]

1.3 輸出描述:

每行一個數字,共n行

整陣列a生成的Kolakoski序列的前n項

1.4 示例1:


輸入:

30 4

2 1 3 1

輸出:(此處為了書寫方便採用逗號分隔)

2, 2, 1, 1, 3, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1, 2,


1.2 程式碼實現

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] a = new int[m];
        for (int i = 0; i < a.length; i++) {
            a[i] = scanner.nextInt();
        }
        scanner.close();
        printList(a, n);
    }
public static void printList(int[] a, int n) {
        int[] result = new int[n];
        int c = 0;
        if (a[0] == 1) {
            result[0] = a[0];
            result[1] = a[1];
        } else {
            result[0] = a[0];
            result[1] = a[0];
        }
        for (int i = 0, top = 0; top < n; i++) {
            int num = a[c++];
            if (c == a.length) {
                c = 0;
            }
            for (int j2 = 0; j2 < result[i] && top < n; j2++) {
                result[top++] = num;
            }
        }
        for (int i = 0; i < result.length; i++) {
            System.out.println(result[i]);
        }
    }

二、裝箱問題


2.1 問題

一個工廠製造的產品形狀都是長方體盒子,它們的高度都是 h,長和寬都相等,一共有六個型號,分別為1*1, 2*2, 3*3, 4*4, 5*5, 6*6。

這些產品通常使用一個 6*6*h 的長方體箱子包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的箱子數量BoxNum.

【思路】:先裝大的,再裝小的。

2.2 程式碼實現

public static void solve2() {
        Scanner scanner = new Scanner(System.in);
        List<String> list = new ArrayList<>();
        String end = "0 0 0 0 0 0";
        while (scanner.hasNext()) {
            String string = scanner.nextLine();
            list.add(string);
            if (string.equals(end)) {
                break;
            }
        }
        scanner.close();
        for (int i = 0; i < list.size() - 1; i++) {
            String string = list.get(i);
            long result = caculate(string);
            if (i == list.size() - 1) {
                System.out.print(result);
            } else {
                System.out.println(result);
            }
        }
    }

    public static int caculate(String string) {
        String[] arr = string.split(" ");
        int[] a = new int[arr.length+1];
        for (int i = 1; i < arr.length+1; i++) {
            a[i] = Integer.parseInt(arr[i-1]);
        }
        int[] num2 = {0,5,3,1};//6*6的大箱子,放入i個3*3小箱子之後,還能放入num2[i]個小箱子
        int result = a[6]+a[5]+a[4];//6*6和5*5和4*4一定是一個佔一個箱子,而3*3 是4個佔一個箱子
        int n2 = a[4]*5+num2[a[3]%4];
        if(a[2]>n2){
            result += (a[2]-n2+8)/9;//如果前面剩餘的空間還不夠放2*2,求出多需要幾個2*2的空間,+8是為了向上取整,
        }
        int n1 = 36*(result-a[6])-a[5]*5*5-a[4]*4*4-a[3]*3*3-a[2]*2*2;
        if(a[1]>n1){
            result += (a[1]-n1+35)/36;
        }
        return result;
    }

相關文章