力扣:710. 黑名单中的随机数

这篇文章介绍了如何使用Java实现一个解决方案,通过hash表将白名单中的数字映射到黑名单范围内,以便在生成随机数时避开黑名单。核心思路是利用HashMap进行快速查找,确保随机数选择的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路
* 使用hash表进行映射
*      首先可以假设,定义黑名单的数字范围是在(n - m, n),那么白名单的范围就是在(0, n-m);
*      这样我们可以把白名单中对应的黑名单映射到白名单上。
*      获取随机数 n - m;
*      当一个map记录映射
*      如果随机数里面的值对应上了我们的映射,返回映射值,如果不匹配,直接返回


import java.util.*;

/**
 * @author xnl
 * @Description:
 * @date: 2022/6/26   22:36
 */
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution(7, new int[]{2, 3,5});
        System.out.println(solution.pick());
    }

    int bound;
    Map<Integer, Integer> map;
    Random random;

    /**
     * 使用hash表进行映射
     *      首先可以假设,定义黑名单的数字范围是在(n - m, n),那么白名单的范围就是在(0, n-m);
     *      这样我们可以把白名单中对应的黑名单映射到白名单上。
     *      获取随机数 n - m;
     *      当一个map记录映射
     *      如果随机数里面的值对应上了我们的映射,返回映射值,如果不匹配,直接返回
     * @param n
     * @param blacklist
     */
    public Solution(int n, int[] blacklist) {
        random = new Random();
        map = new HashMap<>();
        int m = blacklist.length;
        bound = n - m;
        HashSet<Integer> list = new HashSet<>();
        for (int i : blacklist) {
            if (i >= bound){
                list.add(i);
            }
        }

        int w = bound;
        for (int b : blacklist) {
            if (b < bound){
                while (list.contains(w)){
                    w++;
                }
                map.put(b, w);
                w++;
            }
        }
    }

    public int pick() {
        int x = random.nextInt(bound);
        return map.getOrDefault(x, x);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值