leetcode【设计问题】-----384. Shuffle an Array(打乱数组)

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、相关知识点

        洗牌的正确的随机方法,简单的类的设计。

posted @ 2019-04-25 18:00  吾之求索  阅读(153)  评论(0)    收藏  举报