leecode 384. 打乱数组

给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。

实现 Solution class:

  1. Solution(int[] nums) 使用整数数组 nums 初始化对象
  2. int[] reset() 重设数组到它的初始状态并返回
  3. int[] shuffle() 返回数组随机打乱后的结果

示例:

输入
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
输出
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]

解释
Solution solution = new Solution([1, 2, 3]);
solution.shuffle();    // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]
solution.reset();      // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle();    // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]
class Solution {
    private int[] array;
    private int[] original;

    private Random rand = new Random();

    private List<Integer> getArrayCopy() {
        List<Integer> asList = new ArrayList<Integer>();
        for (int i = 0; i < array.length; i++) {
            asList.add(array[i]);
        }
        return asList;
    }

    public Solution(int[] nums) {
        array = nums;
        original = nums.clone();
    }
    
    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
        array = original;
        original = original.clone();
        return array;
    }
    
    /** Returns a random shuffling of the array. */
    public int[] shuffle() {
        List<Integer> aux = getArrayCopy();

        for (int i = 0; i < array.length; i++) {
            int removeIdx = rand.nextInt(aux.size());
            array[i] = aux.get(removeIdx);
            aux.remove(removeIdx);
        }
        return array;
    }
}

 感觉下面的代码也满足题意:

class Solution {

    private int[] array;
    private int[] orginal;
    private Random rand = new Random();

    public Solution(int[] nums) {
          array = nums;
          orginal = nums.clone();
    }
    
    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
        array = orginal;
        orginal = orginal.clone();
        return array;

    }
    
    /** Returns a random shuffling of the array. */
    public int[] shuffle() {
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i< array.length;i++)
        {
            list.add(new Integer(array[i]));
        }

        Collections.shuffle(list);

        for(int i=0;i< array.length;i++)
        {
            array[i] = list.get(i);
        }
        return array;          
    }
}

 打乱索引就可以了

class Solution {
    private  int [] original;
    private  List<Integer> list = new ArrayList<Integer>();
    public Solution(int[] nums) {
        original = nums;
        for(int i =0 ;i< nums.length;i++)
        {
            list.add(i);
        }
    }
    
    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
       return  original.clone();
    }
    
    /** Returns a random shuffling of the array. */
    public int[] shuffle() {
        int [] array = new int[list.size()];
        Collections.shuffle(list);
        for(int i= 0;i<list.size();i++)
        {
            array[i] =original[list.get(i)];
        }
        return  array;
    }
}
原文地址:https://www.cnblogs.com/kpwong/p/14656804.html