1. 程式人生 > 實用技巧 >猿輔導2019校招技術類筆試題 [程式設計題]大巴車(陣列分塊,按塊翻轉,塊內不變)

猿輔導2019校招技術類筆試題 [程式設計題]大巴車(陣列分塊,按塊翻轉,塊內不變)

某天猿輔導 HR 組織大家去漂流,早上,參加團建的同學都到齊了,並且按到達公司的先後順序排好隊了。由於員工太多,一個大巴車坐不下,需要分多個車,車是足夠的,但所有人需要按一定順序上車,按如下規則安排上車的順序:
假設大巴車容量為 m,從隊首開始,每 m 個人分成一個小組,每個小組坐一輛車。同時只有一個車開啟車門供員工上車。 小組之間按從隊尾到隊首順序依次上車,同一小組內先到的同學先上,求所有人上車的順序。
例如: 員工數 8, 車容量 3, 員工到達順序為 1 2 3 4 5 6 7 8, 3個人一個小組,分三個小組
小組一: 1, 2, 3, 小組二: 4, 5, 6,小組三: 7,8。
小組上車順序為: 小組三,小組二,小組一 。
所有員工上車順序為 7 8 4 5 6 1 2 3

輸入描述:

第一行: 員工數和大巴容量
第二行: 所有員工工號(按到達順序)

輸出描述:

員工編號

輸入例子1:

5 3
1 3 5 2 4

輸出例子1:

2 4 1 3 5

解題思路

  1. 先通過 m 儲存員工數,n 儲存大巴容量,nums 陣列儲存員工到達順序。同時定義 temp 表示每一小組的第一個人的位置
  2. 呼叫 helper 方法,若 temp + n < m 則進行遞迴,即找到最後一個小組才停止遞迴
  3. 遞迴時每次輸出 temp ~ temp + n,即一個小組的上車順序

Java遞迴法解題程式碼

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        int[] nums = new int[m];
        for (int i = 0; i < m; i++) {
            nums[i] = in.nextInt();
        }
        helper(nums, 0, m, n);
    }
    
    private static void helper(int[] nums, int temp, int m, int n) {
        if (temp + n < m) {
            helper(nums, temp + n, m, n);
        }
        for (int i = temp; i < temp + n & i < m; i++) {
            System.out.print(nums[i]);
            if (i != n - 1) {
                System.out.print(" ");
            }
        }
    }
}