解题思路
* 使用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);
}
}