给定一个数组 nums ,随机打乱成一个没有重复元素的数组。
方法一
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度为 O(n)
- 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
- 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
- 重复第 1 2 步,直到剩下1个元素为止
function shuffle(arr) {
let length = arr.length;
let random = 0
while (0 != length) {
random = Math.floor(Math.random() * length)
length--;
[arr[length], arr[random]] = [arr[random], arr[length]]
}
return arr;
}
方法二
思路不变,利用无符号右移位运算符向下取整方式
function shuffle(arr){
let length = arr.length
let random = 0;
while(0!=length){
random = (Math.random() * length--) >>> 0;
[arr[length], arr[random]] = [arr[random], arr[length]]
}
return arr;
}
从效率上对比方法一要稍微快一些