项目实践中的一些小算法

3/17/2020, practice

# 判断两个区间是否重叠

  • 重叠的情况有 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 "区间存在重叠交叉!";
}

参考链接 (opens new window)

# 范围内获取 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;
}
Last Updated: 11/26/2020, 5:31:11 PM
Powered By Valine
v1.4.14