# 判断两个区间是否重叠
- 重叠的情况有 4 种,两种相交,两种包含
- 不重叠的情况有 2 种,A 在 B 前或者 B 在 A 前
总结 1:满足 max(A.start, B.start) <= min(A.end, B.end),即重复
总结 2:满足 A.end < B.start || A.start > B.end,即不重复
if(max(A.start, B.start) <= min(A.end, B.end)){
return "区间存在重叠交叉!";
}
# 范围内获取 N 个不重复随机数
/**
* 从 [min, max] 获取 n 个不重复随机数.
*
* @param min 范围 min
* @param max 范围 max
* @param n 个数 n
* @param seed 可选,可自行指定 Random seed,不传使用默认
* @return 参数不合法返回 null,否则返回 int[]
*/
public static int[] getUniqueRandomNums(int min, int max, int n, long... seed) {
int length = max - min + 1;
if (max < min || n < 1 || n > length) {
return null;
}
int[] source = new int[length];
for (int i = 0; i < source.length; i++) {
source[i] = i + min;
}
int[] result = new int[n];
Random random;
if (seed != null && seed.length > 0) {
random = new Random(seed[0]);
} else {
random = new Random();
}
for (int i = 0; i < n; i++) {
// 随机范围 [0, length) 也就是 [0, length - 1],然后 length-- 缩小随机范围
int index = random.nextInt(length--);
result[i] = source[index];
// 下一轮范围缩小,将已经被取到的下标对应的数值替换为 (原 length - 1) 下标对应的数值(即随机范围末尾值)
source[index] = source[length];
}
return result;
}
v1.4.14