LeetCode Shuffle an Array(打亂陣列)

weixin_34087301發表於2018-08-20
打亂一個沒有重複元素的陣列。

示例:

// 以數字集合 1, 2 和 3 初始化陣列。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// 打亂陣列 [1,2,3] 並返回結果。任何 [1,2,3]的排列返回的概率應該相同。
solution.shuffle();

// 重設陣列到它的初始狀態[1,2,3]。
solution.reset();

// 隨機返回陣列[1,2,3]打亂後的結果。
solution.shuffle();
解法一:

遍歷陣列,每次隨機生成一個下標位置,使用 Random.nextInt(),然後交換當前遍歷位置和隨機生成的下標位置的數字,這樣如果陣列有 n 個數字,那麼我們也隨機交換了 n 組位置,從而達到了打亂陣列的目的。

注意:Random.nextInt() 方法的作用是生成一個隨機的 int 值,該值介於 [0,n) 的區間,也就是 0 到 n 之間的隨機 int 值,包含 0 而不包含 n。

    private final int[] originalArray;

    private final int n;

    private final Random mRandom = new Random();

    public Solution(int[] nums) {

        n = nums.length;

        originalArray = nums;
    }

    /**
     * Resets the array to its original configuration and return it.
     */
    public int[] reset() {

        return originalArray;
    }

    /**
     * Returns a random shuffling of the array.
     */
    public int[] shuffle() {

        int[] randomArray = new int[n];

        for (int i = 0; i < n; i++) {
            randomArray[i] = originalArray[i];
        }

        for (int i = 0; i < n; i++) {

            int r = i + mRandom.nextInt(n-i);

            int temp = randomArray[r];

            randomArray[r] = randomArray[i];

            randomArray[i] = temp;
        }

        return randomArray;
    }

相關文章