LeetCode 384 要求设计一个类,能够随机打乱一个没有重复元素的数组,并且支持随时恢复到初始状态。这听起来简单,但要保证所有排列是等可能的,就需要用到经典的 Fisher-Yates 洗牌算法。
解决方案
下面是完整的 Swift 实现。核心思路是用两个数组:一个保存原始数据用于重置,另一个用于当前的打乱操作。
class Solution {
// 保存原始数组
private let original: [Int]
// 当前数组状态
private var current: [Int]
init(_ nums: [Int]) {
self.original = nums
self.current = nums
}
/// 重设数组到它的初始状态并返回
func reset() -> [Int] {
current = original
return current
}
/// 返回数组随机打乱后的结果
func shuffle() -> [Int] {
// 从原始数组开始打乱
current = original
// Fisher-Yates 洗牌算法
for i in stride(from: current.count - 1, through: 1, by: -1) {
j .random(in: i)
current.swapAt(i, j)
}
current
}
}


