Skip to main content

打乱数组

题目

打乱一个数组.

题解

不用多说了, 就是 Fisher–Yates 洗牌算法没得跑了:

  • 写下从 1 到 N 的数字
  • 取一个从 1 到剩下的数字(包括这个数字)的随机数 k
  • 从低位开始, 得到第 k 个数字(这个数字还没有被取出), 把它写在独立的一个列表的最后一位
  • 重复第 2 步, 直到所有的数字都被取出
  • 第 3 步写出的这个序列, 现在就是原始数字的随机排列
/**
* @param {number[]} nums
*/
var Solution = function (nums) {
this.nums = nums
}

/**
* Resets the array to its original configuration and return it.
* @return {number[]}
*/
Solution.prototype.reset = function () {
return this.nums
}

/**
* Returns a random shuffling of the array.
* @return {number[]}
*/
Solution.prototype.shuffle = function () {
const nums = JSON.parse(JSON.stringify(this.nums))

let i = nums.length,
j
while (i) {
j = Math.floor(Math.random() * i--)
;[nums[i], nums[j]] = [nums[j], nums[i]]
}
return nums
}

/**
* Your Solution object will be instantiated and called as such:
* var obj = new Solution(nums)
* var param_1 = obj.reset()
* var param_2 = obj.shuffle()
*/

参考

Fisher-Yates shuffle 洗牌算法