Ring Array Rotation


Submit solution

Points: 10 (partial)
Time limit: 1.0s
Memory limit: 64M

Authors:
Problem type
Allowed languages
Java 19, Java 8

這個程式允許使用者輸入一個整數size表示陣列大小,並輸入第二個整數rotations表示陣列要"旋轉"幾次,接著輸入符合陣列大小size的數字。

輸入完成之後,程式會依照指定的rotations數字對陣列進行向右或是向左旋轉。如果旋轉次數超過陣列大小,則考慮旋轉次數除以陣列大小的餘數。 更詳細的說明請看以下輸出入範例以及程式碼內部註解。

這個程式目前仍缺少RingArray類別的實作,請完成它,並且上傳完整的程式。 除了RingArray類別之外,請勿修改其他已經寫好的部分,違反此規則者,無論自動評測結果為何,在考試中均不計分。但允許輕微的排版差異。

程式完成之後,可用以下測試資料做初步的測試,但仍請自行設計完整的測試資料

輸入 #1:

5 2 1 2 3 4 5 (5個數字,向右旋轉2格,數字清單是1 2 3 4 5)

輸出 #1:

4 5 1 2 3

輸入 #2:

5 -2 1 2 3 4 5 (5個數字,向左旋轉2格,數字清單是1 2 3 4 5)

輸出 #2:

3 4 5 1 2

輸入 #3:

5 7 1 2 3 4 5 (5個數字,向右旋轉7格,實際上相當於向右旋轉2格,數字清單是1 2 3 4 5)

輸出 #3:

4 5 1 2 3

輸入 #4:

5 -7 1 2 3 4 5 (5個數字,向左旋轉2格,實際上相當於向左旋轉2格,數字清單是1 2 3 4 5)

輸出 #4:

3 4 5 1 2

import java.util.Scanner;

// 定義RingArray類別,內部有一個私有整數陣列array
// RingArray類別建構函數的參數是整數size,表示陣列的大小,陣列中的元素都是整數,初始值為0
// RingArray類別有一個setElement方法,用於設置陣列中的元素,第一個參數是索引,第二個參數是值,沒有返回值
// RingArray類別有一個rotate方法,用於旋轉陣列,第一個參數是旋轉次數,可能是負數,沒有返回值
// 例如,如果陣列是[1, 2, 3, 4, 5],旋轉次數是2,則旋轉後的陣列是[4, 5, 1, 2, 3]
// 例如,如果陣列是[1, 2, 3, 4, 5],旋轉次數是-2,則旋轉後的陣列是[3, 4, 5, 1, 2]
// 旋轉次數可能大於陣列大小,此時旋轉次數等於旋轉次數除以陣列大小的餘數
// 例如,如果陣列是[1, 2, 3, 4, 5],旋轉次數是7,則旋轉後的陣列是[4, 5, 1, 2, 3]
// 例如,如果陣列是[1, 2, 3, 4, 5],旋轉次數是-7,則旋轉後的陣列是[3, 4, 5, 1, 2]
// RingArray類別有一個getArray方法,返回當前的整數陣列array
class RingArray {
    ...
}

public class RingArrayTraversal {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 讀取整數 size 和 rotations,分別表示陣列的大小和旋轉次數,其中 rotations 可能是負數
        int size = scanner.nextInt();
        int rotations = scanner.nextInt();

        // 創建一個 RingArray 物件,大小為 size
        RingArray ringArray = new RingArray(size);

        // 接著讀取 size 個整數,並將它們存儲在 ringArray 物件中
        for (int i = 0; i < size; i++) {
            ringArray.setElement(i, scanner.nextInt());
        }

        // 將 ringArray 物件旋轉 rotations 次,注意 rotations 可能是負數
        ringArray.rotate(rotations);

        // 輸出旋轉後的陣列,每個整數之間用空格分隔
        int[] array = ringArray.getArray();
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

Comments


  • 0
    scu09156146  commented on April 26, 2024, 3:06 p.m. edited

    題解

    import java.util.Scanner;
    
    //定義RingArray類別
    class RingArray {
        int size;
        private int[] array; // 私有整數陣列,初始值為0
    
        // 建構函數的參數是整數size,表示陣列的大小
        public RingArray(int size) {
            this.size = size;
            array = new int[size];
        }
    
        // setElement():設置陣列中的元素,第一個參數是索引,第二個參數是值,沒有返回值
        public void setElement(int i, int input) {
            array[i] = input;
        }
    
        // rotate():旋轉陣列,第一個參數是旋轉次數,沒有返回值
        public void rotate(int rotations) {
            int[] rArray = new int[size]; // 空白陣列,記錄旋轉後的陣列
    
            // point指標:原本index=0旋轉後的新index。因旋轉次數的值可能是負數或大於陣列大小,要先做調整
            int point = (rotations % size >= 0) ? rotations % size : rotations % size + size;
    
            for (int i = 0; i < size; i++) {
                rArray[point] = array[i];
                point = (point + 1) % size;
            }
            array = rArray; // 更新陣列
        }
    
        // getArray():返回當前的整數陣列array
        public int[] getArray() {
            return array;
        }
    }
    
    public class RingArrayTraversal {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            // 讀取整數 size 和 rotations,分別表示陣列的大小和旋轉次數
            int size = scanner.nextInt();
            int rotations = scanner.nextInt(); // 可能是負數
    
            // 創建一個 RingArray 物件,大小為 size
            RingArray ringArray = new RingArray(size);
    
            // 接著讀取 size 個整數,並將它們存儲在 ringArray 物件中
            for (int i = 0; i < size; i++) {
                ringArray.setElement(i, scanner.nextInt());
            }
            scanner.close();
    
            // 將 ringArray 物件旋轉 rotations 次
            ringArray.rotate(rotations);
    
            // 輸出旋轉後的陣列,每個整數之間用空格分隔
            int[] array = ringArray.getArray();
            for (int i = 0; i < array.length; i++) {
                System.out.print(array[i] + " ");
            }
        }
    }