我的思路是在创造随机数组时,使用rand() %nums.size();再使用一个visited数组去判断哪些元素被选定,来避免重复选定。这种方法就会出现一种多次命中选定元素的问题,以及还需要重新构造一个nums.size()大小的数组。
代码如下:
class Solution {
private:
vector<int> a;
public:
Solution(vector<int>& nums) {
this->a = nums;
}
vector<int> reset() {
return a;
}
vector<int> shuffle() {
vector<int> suiji;
int visited[200] = {};
/*
uniform_int_distribution<unsigned> u(0, a.size()-1);
default_random_engine e; // 生成无符号随机整数*/
size_t i = 0; int j;
// 将 u 作为随机数源
// 每个调用返回在指定范围内并服从均匀分布的值
while (i<a.size())
{ j = rand() % a.size();
if (visited[j] == 0)
{
visited[j] = 1;
suiji.push_back(a[j]);
}
else if (visited[j]==1)
{
i--;
}
i++;
}
return suiji;
}
};
i=0;第一个数开始
题解思路是从第i个数开始,在后面的数中任意挑选一个与第i个数替换,然后依次执行这种操作(i++),直到倒数第一个数。