方法1:暴力
所以要用list数据结构
class Solution {
public:
Solution(vector<int>& nums) {
this->nums = nums;
this->original.resize(nums.size());
copy(nums.begin(), nums.end(), original.begin());
}
vector<int> reset() {
copy(original.begin(), original.end(), nums.begin());
return nums;
}
vector<int> shuffle() {
vector<int> shuffled = vector<int>(nums.size());
list<int> lst(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int j = rand()%(lst.size());
auto it = lst.begin();
advance(it, j);
shuffled[i] = *it;
lst.erase(it);
}
copy(shuffled.begin(), shuffled.end(), nums.begin());
return nums;
}
private:
vector<int> nums;
vector<int> original;
};
方法2:Fisher-Yates 洗牌算法
class Solution {
public:
vector<int> nums;
vector<int> original;
Solution(vector<int>& nums) {
this->nums=nums;
this->original=nums;
}
vector<int> reset() {
return original;
}
vector<int> shuffle() {
int len=nums.size();
for(int i=0;i<len;i++)
{
int j=i+rand()%(len-i);
swap(nums[i],nums[j]);
}
return nums;
}
};