栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022/6/26每日一题———黑名单中的随机数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022/6/26每日一题———黑名单中的随机数

题目:
黑名单中的随机数
个人思路:
直接得到0~n范围一个随机数,然后判断是不是在黑名单里面,不在的话就输出,在的话就重复执行pick()函数。缺点很明显,如果得到了一个随机数在黑名单中,那我们就需要重新得到一个随机数,最坏的情况需要执行m次随机数获取,与题意不符。
参考思路:
使用映射,假设把0 ~ n-1的数字分成两个部分,0 ~ n-m部分是白名单,n-m ~ n是黑名单,m是黑名单元素个数。这样我们得到了一个随机数,直接判断他是不是在黑名单,不是的话就直接输出,是的话就输出白名单里的数字,而输出白名单里哪个数字,就需要用映射来决定。

映射很容易想到使用哈希几何,C++中体现就是map
代码:

class Solution {
public:
    Solution(int n, vector& blacklist) {
        bound = n-blacklist.size();
        unordered_set black; //存储黑名单
        for(int num:blacklist)
        {
            if(num >= bound)
            {
                black.emplace(num);
            }
        }
        int w = bound;
        for(int num:blacklist)
        {
            if(num < bound)
            {
                while(black.count(w))
                    w++;
                map[num] = w++; //把前半部分的黑名单数字num映射到后半部分的白名单数字w
            }
        }
    }
    
    int pick() 
    {
        //srand(time(0));
        int num =  rand()%bound;  //获得0~n-1范围内的随机数
        return map.count(num)?map[num]:num; //是白名单,就输出;不是,就输出map中的映射
    }
private:
    int bound; //黑白名单分割线
    unordered_map map; //map,存储映射
};

十年饮冰,难凉热血

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997989.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号