[抄题]:
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();
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
[思维问题]:
[英文数据结构或算法,为什么不用别的数据结构或算法]:
用克隆函数产生一个同样的数组
//use 'clone' to produce a same array
this.copy = nums.clone();
产生随机数的几种方法:
通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:
final long l = System.currentTimeMillis();
通过Math.random()来获取随机数。实际上,它返回的是0(包含)到1(不包含)之间的double值。使用方法如下:
final double d = Math.random();
通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。
比如,获取[0, 100)之间的int整数。方法如下:
int i2 = random.nextInt(100);
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
不知道数组的大小就不用写出来,声明一下数组名即可
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
in-place也没有那么难,改改index,往里面塞就行了
math.random 和 random类是不同的
[复杂度]:Time complexity: O(n) Space complexity: O(1)
[算法思想:迭代/递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
实现类的solution可能是自制的,要带上参数。
数组必须一个个地打印:
class MyCode { public static void main (String[] args) { int[] nums = {1, 2, 3,54,32,55,87,13}; Solution answer = new Solution(nums); int[] rst = answer.shuffle(); for (int i = 0; i < 8; i++) System.out.println("rst[i] = " + rst[i]); int[] copy = answer.reset(); for (int i = 0; i < 8; i++) System.out.println("copy[i] = " + copy[i]); }
[潜台词] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// package whatever; // don't place package name! import java.io.*; import java.util.*; import java.lang.*; class Solution { //unnecessary to declare the space of the array int[] nums; int[] copy; public Solution(int[] nums) { this.nums = nums; //use 'clone' to produce a same array this.copy = nums.clone(); } /** Resets the array to its original configuration and return it. */ public int[] reset() { return copy; } /** Returns a random shuffling of the array. */ public int[] shuffle() { //random Random random = new Random(); //generate a random index j, then swap for (int i = 0; i < nums.length; i++) { int j = random.nextInt(i + 1); int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } //return return nums; } } class MyCode { public static void main (String[] args) { int[] nums = {1, 2, 3,54,32,55,87,13}; Solution answer = new Solution(nums); int[] rst = answer.shuffle(); for (int i = 0; i < 8; i++) System.out.println("rst[i] = " + rst[i]); int[] copy = answer.reset(); for (int i = 0; i < 8; i++) System.out.println("copy[i] = " + copy[i]); } }