1、题目描述
2、分析
第一次碰到这种类似于设计一个类的题目,题目要求实现两个函数,reset()函数返回未打乱的数组,shuffle()函数返回一个打乱的数组。那么我们需要一个变量ori_num,保存一开始的原来的顺序的数组,这个变量设置为私有的。构造函数里需要用nums对这个变量进行初始化,初始化的方法可以有很多,可以使用列表初始化、也可以使用拷贝构造函数。这样reset函数的实现就很简单了,只需要将ori_num返回就行。shuffle()函数,设计一个局部变量并且初始化为ori_num,之后遍历数组,使用rand()函数生成一个随机数,并且对这个随机数以数组大小取余,这样这个随机数就会在数组大小范围内,然后以这个数为下标和当前数组的值进行交换,这样就会随机打乱数组的值。(这样是可以AC的,但是其实每一种出现的可能性并不相同,具体证明查看这个),正确的做法应该是i + rand() % (res.size() - i)而不能写成rand() % res.size()。
3、代码
class Solution {
public:
//构造函数可以有多种写法
Solution(vector<int>& nums) :ori_nums(nums){
}
Solution(vector<int>& nums) {
ori_nums=nums;//:ori_nums=std::move(nums)也可以
}
/** Resets the array to its original configuration and return it. */
vector<int> reset() {
return ori_nums;
}
/** Returns a random shuffling of the array. */
vector<int> shuffle() {
vector<int> res_num(ori_nums);
int n=ori_nums.size();
for(int i=0;i<n;++i){
int t=i+(rand()%(n-i));//(rand()%n)这个虽然可以通过但是其实是错误的。
swap(res_num[i],res_num[t]);
}
return res_num;
}
private:
vector<int> ori_nums;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(nums);
* vector<int> param_1 = obj->reset();
* vector<int> param_2 = obj->shuffle();
*/
4、相关知识点
洗牌的正确的随机方法,简单的类的设计。