Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

计算多个区间的交集 #32

Open
CodeRookie262 opened this issue Jan 28, 2021 · 9 comments
Open

计算多个区间的交集 #32

CodeRookie262 opened this issue Jan 28, 2021 · 9 comments
Labels

Comments

@CodeRookie262
Copy link
Owner

计算多个区间的交集

区间用长度为2的数字数组表示,如[2, 5]表示区间2到5(包括2和5);
区间不限定方向,如[5, 2]等同于[2, 5];
实现getIntersection 函数
可接收多个区间,并返回所有区间的交集(用区间表示),如空集用null表示

示例:

getIntersection([5, 2], [4, 9], [3, 6]); // [4, 5]
getIntersection([1, 7], [8, 9]); // null
@CodeRookie262
Copy link
Owner Author

var getIntersection = function getIntersection(...secs) {
        let len = secs.length,
          ans = null;

        if (len === 0) return ans;
        if (len === 1) return secs[0].sort((a, b) => a - b);
        ans = secs[0]; // 以第一个区间作为参照

        for (var i = 1, l = secs.length; i < l; i++) {
          // 无交集 ans 最大值小于当前区间的最小值 / ans 的最小值大于当前区间的最大值
          if (
            Math.min(...secs[i]) > Math.max(...ans) ||
            Math.min(...ans) > Math.max(...secs[i])
          ) {
            return null;
          }

          ans = [
            Math.max(Math.min(...ans), Math.min(...secs[i])),
            Math.min(Math.max(...ans), Math.max(...secs[i]))
          ];
        }

        return ans;
      };

@yuki-mirai
Copy link

var getIntersection = function(...args) {
    if (!args || args.length == 1) return null;

    let ret = null;
    for (let i = 0; i < args.length; i ++) {
        ret = intersection(ret, args[i]);
    }

    return ret;
};

var intersection = function (fArr, sArr) {
    if (!fArr || !sArr) return fArr ? fArr : sArr ? sArr : [];

    let minV1 = fArr[0] > fArr[1] ? fArr[1] : fArr[0];

    let minV2 = sArr[0] > sArr[1] ? sArr[1] : sArr[0];

    let maxV1 = fArr[0] < fArr[1] ? fArr[1] : fArr[0];

    let maxV2 = sArr[0] < sArr[1] ? sArr[1] : sArr[0];

    if (maxV1 < minV2 || maxV2 < minV1) return null;

    // let retArr = [];

    // if (minV1 > minV2) retArr.push(minV1); else retArr.push(minV2);

    // if (maxV1 < maxV2) retArr.push(maxV1); else retArr.push(maxV2);

    // return retArr;
    return [minV1 > minV2 ? minV1 : minV2, maxV1 < maxV2 ? maxV1 : maxV2];
}

@CodeRookie262
Copy link
Owner Author

@Mirai39 优秀,不过我觉得只有一个区间的话应该直接返回出来,而不是null。

@yuki-mirai
Copy link

yuki-mirai commented Jan 29, 2021

@Mirai39 优秀,不过我觉得只有一个区间的话应该直接返回出来,而不是null。

if (!args || args.length == 1) return null;

是指这行吗?但是如果只给一个区间的话就不存在交集啊

@CodeRookie262
Copy link
Owner Author

@Mirai39 优秀,不过我觉得只有一个区间的话应该直接返回出来,而不是null。

if (!args || args.length == 1) return null;

是指这行吗?但是如果只给一个区间的话就不存在交集啊

我觉得它和它本身就是一个交集,就和你要求最大值一样,只有一个数值的话那么这个数值就是最大的,而不是得有另外一个参照值。

@yuki-mirai
Copy link

@Mirai39 优秀,不过我觉得只有一个区间的话应该直接返回出来,而不是null。

if (!args || args.length == 1) return null;

是指这行吗?但是如果只给一个区间的话就不存在交集啊

我觉得它和它本身就是一个交集,就和你要求最大值一样,只有一个数值的话那么这个数值就是最大的,而不是得有另外一个参照值。

O(∩_∩)O哈哈~,我觉得这跟最大值有点不一样,因为既然是交集的话那么必然要有参照,可以联想下“两条线交叉”,如果只有一条线,很难想象可以跟交叉联系到一起

@CodeRookie262
Copy link
Owner Author

@Mirai39 嗯,是我对交集的理解不太对,它是需要两个或两个以上的区间对比才成立的哈哈😝😝

@CodeRookie262
Copy link
Owner Author

var getIntersection = function getIntersection(...secs) {
        let len = secs.length,
          ans = null;

        if (len === 0) return ans;
        if (len === 1) return secs[0].sort((a, b) => a - b);
        ans = secs[0]; // 以第一个区间作为参照

        for (var i = 1, l = secs.length; i < l; i++) {
          // 无交集 ans 最大值小于当前区间的最小值 / ans 的最小值大于当前区间的最大值
          if (
            Math.min(...secs[i]) > Math.max(...ans) ||
            Math.min(...ans) > Math.max(...secs[i])
          ) {
            return null;
          }

          ans = [
            Math.max(Math.min(...ans), Math.min(...secs[i])),
            Math.min(Math.max(...ans), Math.max(...secs[i]))
          ];
        }

        return ans;
      };

更改 return 条件

+       if (len === 0 || len === 1) return ans;
-        if () return secs[0].sort((a, b) => a - b);

@yuki-mirai
Copy link

@Mirai39 嗯,是我对交集的理解不太对,它是需要两个或两个以上的区间对比才成立的哈哈😝😝

一起加油(//̀Д/́/)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants