题目要求:
给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。
解释:
Solution(int[] nums) 使用整数数组 nums 初始化对象
int[] reset() 重设数组到它的初始状态并返回
int[] shuffle() 返回数组随机打乱后的结果
本道题可以使用洗牌算法(Knuth shuffle算法):对于有n个元素的数组来说,为了保证洗牌的公平性,应该要能够等概率的洗出n!种结果。
代码如下:
class Solution {
private int[] nums;
private Random random;
public Solution(int[] nums) {
this.nums = nums;
random = new Random();// 初始化对象
}
/** 重设数组到它的初始状态并返回*/
public int[] reset() {
return nums;
}
/** 返回数组随机打乱后的结果 */
public int[] shuffle() {
int[] copy = nums.clone();// 数组的复制
for (int i = copy.length - 1; i > 0; i--) {
int j = random.nextInt(i + 1);
swap(copy, i, j);
}
return copy;
}
private void swap(int[] nums, int i, int j) { // 数组内元素交换
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
get!