给定一个包含 [0,n ) 中独特的整数的黑名单 B,写一个函数从 [ 0,n ) 中返回一个不在 B 中的随机整数。

对它进行优化使其尽量少调用系统方法 Math.random() 。

提示:

1 <= N <= 1000000000
0 <= B.length < min(100000, N)
[0, N) 不包含 N,详细参见 interval notation 。

示例 1:

输入:
["Solution","pick","pick","pick"]
[[1,[]],[],[],[]]
输出: [null,0,0,0]

示例 2:

输入:
["Solution","pick","pick","pick"]
[[2,[]],[],[],[]]
输出: [null,1,1,1]

示例 3:

输入:
["Solution","pick","pick","pick"]
[[3,[1]],[],[],[]]
Output: [null,0,0,2]

示例 4:

输入:
["Solution","pick","pick","pick"]
[[4,[2]],[],[],[]]
输出: [null,1,3,1]

输入语法说明:

输入是两个列表:调用成员函数名和调用的参数。Solution的构造函数有两个参数,N 和黑名单 B。pick 没有参数,输入参数是一个列表,即使参数为空,也会输入一个 [] 空列表。

思路分析: 如果我们使用rand产生[0, N)的随机数,需要剔除黑名单中的元素。如果我们使用rand产生[0, N - blacklistSize)中的随机数(blacklistSize为黑名单的大小),如果黑名单中有一部分数据出现在[0, N - blacklistSize)中,则必定会有相同数量的非黑名单数字出现在[N - blacklistSize, N)中,我们只要将在[0, N - blacklistSize)中的黑名单的数据一一映射到[N - blacklistSize, N)中非黑名单中的数据即可。

class Solution {public:int nowSize;//修改后的Nunordered_map<int, int> hashMap;//映射hash表Solution(int N, vector<int>& blacklist) {int blacklistSize = blacklist.size();nowSize = N - blacklistSize;int startNum = nowSize;//扫描在[N - blacklistSize, N)中非黑名单中的数据set<int> mySet(blacklist.begin(), blacklist.end());auto it = mySet.begin();//扫描黑名单中在[0, N - blacklistSize)的数据while (it != mySet.end() && *it < nowSize) {while (mySet.find(startNum) != mySet.end()) {++startNum;}//将在[0, N - blacklistSize)中的黑名单的数据一一映射到[N - blacklistSize, N)中非黑名单中的数据hashMap[*(it++)] = startNum++;}}int pick() {int randNum = rand() % nowSize;//随机生成[0, N - blacklistSize)if (hashMap.count(randNum)) {//如果randNum在hash表中,说明它是黑名单中的数据,需要修改为它映射的数据return hashMap[randNum];}else {//否则直接返回return randNum;}}
};/*** Your Solution object will be instantiated and called as such:* Solution* obj = new Solution(N, blacklist);* int param_1 = obj->pick();*/

LeetCode 黑名单中随机数(图解)相关推荐

  1. Java实现 LeetCode 710 黑名单中的随机数(黑白名单)

    710. 黑名单中的随机数 给定一个包含 [0,n ) 中独特的整数的黑名单 B,写一个函数从 [ 0,n ) 中返回一个不在 B 中的随机整数. 对它进行优化使其尽量少调用系统方法 Math.ran ...

  2. 710. Random Pick with Blacklist 黑名单中的随机数(Hard)

    1. 描述 给定一个包含 [0,n) 中不重复整数的黑名单 blacklist ,写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数. 对它进行优化使其尽量少的调用Math. ...

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

    题目: 黑名单中的随机数 个人思路: 直接得到0~n范围一个随机数,然后判断是不是在黑名单里面,不在的话就输出,在的话就重复执行pick()函数.缺点很明显,如果得到了一个随机数在黑名单中,那我们就需 ...

  4. C#LeetCode刷题-随机数

    随机数篇 # 题名 刷题 通过率 难度 470 用 Rand7() 实现 Rand10() 34.4% 中等 478 在圆内随机生成点 22.8% 中等 497 非重叠矩形中的随机点 22.8% 中等 ...

  5. MTK方案上基于Android N拦截黑名单中的短/彩信的方法

    --- 作者 zuhui.zhang 安卓7.0原生系统增加了在framework层拦截黑名单来电和短信,但不会将数据保存到数据库,因此无法查看到被拦截的来电和短信.在安卓7.0之前,黑名单的短信默认 ...

  6. 案件被终本后,失信被执行人会从黑名单中移除吗?

    转自:http://wenzhang.ztcztc.com/Detail.aspx?id=2EAA50DD-D49D-DA2D-5347-75FCED76FD65 由于债权债务关系的复杂性,近年来想要 ...

  7. fail2ban从黑名单中移除IP

    fail2ban从黑名单中移除IP tags: 网站 个人网站:wanghualong.cn fail2ban从黑名单(ban list)中移除IP的方法: 网上一堆教程长篇大论,废话连篇其实只需要一 ...

  8. 软件保护工具VMProtect将许可系统集成到应用程序(7)——黑名单中的序列号

    VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果. 建筑保护总是经历两个主要步骤 ...

  9. 710. 黑名单中的随机数

    给定一个包含 [0,n ) 中独特的整数的黑名单 B,写一个函数从 [ 0,n ) 中返回一个不在 B 中的随机整数. 对它进行优化使其尽量少调用系统方法 Math.random() . 提示: 1 ...

最新文章

  1. SSL证书过期替换之踩坑总结
  2. Python之多线程
  3. 多个反斜杠的消除处理
  4. 012_Redis的aof持久化方式
  5. Linux中iptables的用法
  6. mysql数据库试题下载_MYSQL数据库2013-2014学年考试试卷
  7. sublime关于行操作的快捷键:如快速复制整行等
  8. 解决python3与python2的pip命令冲突问题冲突(window版)
  9. jquery实战--定宽
  10. 2019年的wps计算机考试题,2019年3月计算机一级WPS模拟题及答案(2.21)
  11. 【机器学习】sklearn数据特征预处理:归一化和标准化
  12. MYSQL ERROR 1045 错误的解决办法 (转)
  13. git21天打卡-day8 本地分支push到远程服务器
  14. php srs api,文档中心
  15. Grammar API
  16. Typora-PicGo-SMMS图床(Mac电脑和windows电脑)
  17. 运用String.format格式化方法和消息枚举类型创建消息模板
  18. 程序员职业规划:让自己变得重要(转)
  19. db2 处理linux时间戳,如何获取DB2表空间前滚操作所需的最小恢复时间戳记
  20. PCK - Percentage of Correct Keypoints

热门文章

  1. 配置maven自带插件的默认版本
  2. 在IT行业中,学历高低无所谓?
  3. 走迷宫--图的搜索(bfs)并记录路径
  4. 酷家乐对电脑配置有要求?
  5. Ubuntu 16.04 LTS 一键安装NVIDIA显卡驱动
  6. 什么是steam游戏搬砖汇率差项目,真的赚钱吗?
  7. Android 8/9高通平台客制化虚拟导航按键隐藏
  8. 【程序人生】一位普通计算机学生本科期间图书馆借阅书籍清单~
  9. Mac 为 shell 添加函数
  10. 华为手机进入工程模式命令