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

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

class Solution {public:Solution(int n, vector<int>& blacklist) {bound = n-blacklist.size();unordered_set<int> 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<int,int> map; //map,存储映射
};

十年饮冰,难凉热血

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

  1. 【LeetCode】2022 7月 每日一题

    [LeetCode]2022 7月 每日一题 前言 七月太忙了,又是项目又是练车又是各种比赛.大概有10天的每日一题没有当天写完(虽然后面补上了). 将每日一题的所有思路记录在这里分享一下. 7.1 ...

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

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

  3. 2022夏暑假每日一题(八)

    一. 统计单词(字符串处理) 双指针写法: cin写法 二.进制转换(进位制) 写法一:cin>>hex>>x,表示后面的数为十六进制 写法二:手动转进制 三.切木棍(推公式) ...

  4. 2022.4.30每日一题

    一.每日一题 908. 最小差值 I 给你一个整数数组 nums,和一个整数 k . 在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i .将 nums[i ...

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

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

  6. 2022.10.14每日刷题打卡

    リモコン 题意: 题目描述: 高桥君要调整空调的设定温度.现在的设定温度是A度,而他想调到B度. 空调遥控器按一次可以: 上调或下调1度 上调或下调5度 上调或下调10度 高桥君想求出从A调到B度的最 ...

  7. 2022.11.14每日刷题打卡

    过山车 原题链接:传送门 二分图最大匹配模板题,但sb了数组开小了一直TLE,虽然是模板但很长教训. #include <bits/stdc++.h> using namespace st ...

  8. 2023.6.26每日一题

    假设此题没有num2的影响,那么就可以计算num1二进制的1的个数,就是要操作的次数. 此时题中有num2,我们不妨从小到大枚举次数k,一次将所有次数的num2减去,再计算1的个数      k为操作 ...

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

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

最新文章

  1. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
  2. 网站本地调试工具_一款Web调试代理工具:Fiddler
  3. 常用技巧 —— 离散化
  4. SAP License:WBS结果分析
  5. 本地缓存到分布式缓存( Guava, Caffeine, Memcached, Redis)
  6. 支付宝APP支付里设置应用网关和授权回调地址是不必填的
  7. 并发编程大师系列之:CountDownLatch和Join
  8. Windows phone 8.1 MessageBox 变了哦!
  9. OSError: [WinError 126] module could not be found(OSError: [WinError 126] 找不到指定的模块)
  10. IDEA代码格式化快捷键
  11. NetMeeting的使用
  12. 作用JavaScript访问和操作数据库
  13. 剑指offer_3 -- 构建乘积数组
  14. 【计算机网络 一 概述】
  15. [JS] canvas 详解
  16. 持续集成服务 Travis CI 教程
  17. ORACLE的统计分析
  18. 阿里云的mysql问题
  19. ats2851 / cm591 ugreen bluetooth 5.3 for Linux
  20. 才子佳人与QQ游戏美女找茬外挂实现

热门文章

  1. 约瑟夫问题与魔术(七)——魔术《The Australian Deal》
  2. Xamarin.Forms 之简单介绍
  3. Maven报错Maven报红线问题
  4. 书论22 虞世南《书旨述》
  5. 品优购项目--首页index.html
  6. OMG! 这款大屏可视化神器公测了
  7. 10几个高分数的珍馐美食纪录片子,陪伴您从早到晚
  8. js获取时间戳 时间戳转时间
  9. python PDF合并后大小不一致解决
  10. python基础:数组常用函数和方法