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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值