给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。
实现 Solution
class:
- Solution(int[] nums) 使用整数数组 nums 初始化对象
- int[] reset() 重设数组到它的初始状态并返回
- 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; } }