实习第五天 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 Map
    mapping; 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
      • 使用迭代器遍历映射中的键,查找一个可用的数。
      • 如果找到,返回该数;否则,继续生成新的随机索引,直到找到为止。

    这种优化方法通过预处理减少了随机数的调用次数,每次调用时采用一种缓存和概率选择的策略,确保高效地返回一个可用整数。

    上一篇:6 字符串的排列
    下一篇:10 II. 左旋转字符串

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月22日 15时45分36秒