1. 程式人生 > >[LeetCode] 384. Shuffle an Array

[LeetCode] 384. Shuffle an Array

題目

Shuffle a set of numbers without duplicates.

Example:

// Init an array with set 1, 2, and 3.
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// Shuffle the array [1,2,3] and return its result. Any permutation of [1,2,3] must equally likely to be returned.
solution.shuffle();

// Resets the array back to its original configuration [1,2,3].
solution.reset();

// Returns the random shuffling of array [1,2,3].
solution.shuffle();

思路

題目大意

實現一個洗牌類的相關方法。

  1. 構造方法 將待洗牌的 int []nums傳入。
  2. 方法reset(),返回 最初的 nums陣列。
  3. 方法shuffle(),返回 對nums的洗牌結果。

解題思路

類成員變數 生成一份 nums的備份供 方法reset() 使用。 shuffle() 實現是 從nums中選出第1個位置,再從nums中 n個元素(包括自己) 交換,確定第1個位置。然後選出第 2個位置,再從剩下的n-1個元素(包括自己)交換。直到只剩最後一個元素。

code

class Solution {
    int[] backup_nums;
    int[] nums;
Random rd = new Random(); public Solution(int[] nums) { this.backup_nums = nums; this.nums = nums.clone(); } /** Resets the array to its original configuration and return it. */ public int[] reset() { return this.backup_nums; } /** Returns a random shuffling of the array. */
public int[] shuffle() { int n = this.nums.length; while(n>1){ n--; int k = rd.nextInt(n+1); int value = this.nums[k]; this.nums[k] = this.nums[n]; this.nums[n] = value; } return this.nums; } } /** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(nums); * int[] param_1 = obj.reset(); * int[] param_2 = obj.shuffle(); */