
实习第五天 05.06
发布日期:2021-05-10 01:35:00
浏览次数:12
分类:精选文章
本文共 1779 字,大约阅读时间需要 5 分钟。
为了高效地从[0, n)中返回一个不在黑名单B中的整数,我们可以使用一种预处理和概率选择的优化方法。以下是详细的步骤和实现思路:
预处理阶段:
- 白名单的创建:首先,生成一个包含所有不在黑名单B中的数的集合,称为白名单。
- 生成映射:将黑名单中的每个数映射到白名单中的一个随机数。这样,当随机选择一个数时,可以快速找到对应的可用数。
实现细节:
- 初始化:
- 创建一个白名单
whiteList
,包含所有不在黑名单中的数。 - 创建一个映射
mapping
,将黑名单中的每个数对应到whiteList
中的一个数。
- 创建一个白名单
- 随机选择:
- 生成一个随机数
randomIndex
,然后查找映射mapping
中的某个可用数。若找到对应的数,则返回它;否则,返回randomIndex
本身。 - 通过迭代器
iterator
遍历白名单,确保快速访问。
- 生成一个随机数
优化考虑:
- 预处理阶段计算一次,减少了多次的判断和随机调用。
- 使用映射和迭代器技术,加快了数据访问速度,减少了函数调用次数。
优化后的代码实现:
import java.util.*;public class Solution { private static Mapmapping; private static Iterator iterator; private static int whiteListSize; public Solution(int n, int[] blacklist) { // 创建白名单 whiteListSize = n - blacklist.length; List whiteList = new ArrayList<>(); for (int i = 0; i < whiteListSize; i++) { whiteList.add(i); } // 创建映射,将黑名单中的每个i映射到whiteList中的某个数 for (int i : blacklist) { if (i < n) { // 确保i在查询范围内 mapping.put(i, whiteList.get(whiteListSize - i - 1)); } } // 创建迭代器 iterator = mapping.keySet().iterator(); } public int pick() { // 返回一个随机数作为索引 int randomIndex = (int) Math.random() * iterator.hasNext() ? whiteListSize - 1 : 0; while (iterator.hasNext()) { int index = randomIndex; randomIndex = (int) Math.random() * whiteListSize; if (!iterator.next().equals(randomIndex)) { // 找到一个可用的数 return randomIndex; } } // 如果所有键都已使用,随机返回一个数 return randomIndex; }}
代码解释:
- 预处理阶段:构建白名单和映射,确保每个黑名单元素对应到一个可用的数。
- pick()方法:
- 生成一个随机索引
randomIndex
。 - 使用迭代器遍历映射中的键,查找一个可用的数。
- 如果找到,返回该数;否则,继续生成新的随机索引,直到找到为止。
- 生成一个随机索引
这种优化方法通过预处理减少了随机数的调用次数,每次调用时采用一种缓存和概率选择的策略,确保高效地返回一个可用整数。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月22日 15时45分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
设计模式(三)—— 发布-订阅模式
2019-03-07
第十一节 IO编程
2019-03-07
十八、flask之g对象
2019-03-07
GIT学习笔记
2019-03-07
Linux系统调用过程
2019-03-07
stm32 uv5打开uv4工程错误
2019-03-07
mysql怎么终止一个事务_MySql 中游标,事务,终止存储过程方法总结
2019-03-07
SmartRefreshLayout 上拉加载下拉刷新
2019-03-07
Gradle 版本对应关系
2019-03-07
app:processDevDebugResources
2019-03-07
每天记录学习的新知识:Live Templates 注释模板
2019-03-07
每天记录学习的新知识: AssetManager 获取资源的方式
2019-03-07
EventBus
2019-03-07
最基础的urllib.request.urlopen()基本使用
2019-03-07
C# 异常
2019-03-07
分包处理方案
2019-03-07
vs 设置静态库输出路径
2019-03-07
内存释放
2019-03-07
strlen sizeof 快
2019-03-07
QT添加自定义控件
2019-03-07