Skip to content

计算多个区间的交集 #32

Open

Description

@CodeRookie262

计算多个区间的交集

区间用长度为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

Activity

  1. CodeRookie262 commented on Jan 29, 2021

    @CodeRookie262
    OwnerAuthor
    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;
          };
  2. yokuray commented on Jan 29, 2021

    @yokuray
    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];
    }
  3. CodeRookie262 commented on Jan 29, 2021

    @CodeRookie262
    OwnerAuthor

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

  4. yokuray commented on Jan 29, 2021

    @yokuray

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

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

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

  5. CodeRookie262 commented on Jan 29, 2021

    @CodeRookie262
    OwnerAuthor

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

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

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

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

  6. yokuray commented on Jan 29, 2021

    @yokuray

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

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

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

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

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

  7. CodeRookie262 commented on Jan 29, 2021

    @CodeRookie262
    OwnerAuthor

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

  8. CodeRookie262 commented on Jan 29, 2021

    @CodeRookie262
    OwnerAuthor
    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);
  9. yokuray commented on Jan 29, 2021

    @yokuray

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions