2019.10.5 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
github:https://github.com/ChopinXBP/LeetCode-Babel
一道经典的洗牌问题,可以用Fisher-Yates洗牌算法。遍历每一个元素i,将i与i之后的一个随机元素j互换。随机元可以通过random.nextInt(max - min) + min生成。
Shuffle a set of numbers without duplicates.
打乱一个没有重复元素的数组。
示例:
// 以数字集合 1, 2 和 3 初始化数组。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);
// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();
// 重设数组到它的初始状态[1,2,3]。
solution.reset();
// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();
import java.util.Random;
/**
*
* Shuffle a set of numbers without duplicates.
* 打乱一个没有重复元素的数组。
*
*/
public class ShuffleAnArray {
//洗牌问题:Fisher-Yates 洗牌算法
class Solution {
private int[] array;
private int[] original;
Random random;
public Solution(int[] nums) {
random = new Random();
array = nums;
original = nums.clone();
}
/** Resets the array to its original configuration and return it. */
public int[] reset() {
array = original.clone();
return array;
}
/** Returns a random shuffling of the array. */
//Fisher-Yates 洗牌算法:遍历每一个元素i,将i与i之后的一个随机元素j互换
public int[] shuffle() {
for(int i = 0; i < array.length; i++){
swapArray(i, randRange(i, array.length));
}
return array;
}
private int randRange(int min, int max){
return random.nextInt(max - min) + min;
}
private void swapArray(int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
/**
* 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();
*/
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#