将一系列数字拆分为特定的间隔数

时间:2018-03-08 14:53:35

标签: javascript algorithm ecmascript-6

我有一个间隔[0; max],我想将其拆分为特定数量的子间隔。为此,我编写了一个名为getIntervalls(max, nbIntervals)的函数,其中max是我第一个区间中的最大元素,nbIntervals是预期子区间的数量。

例如:

  • getIntervalls(3, 2)应该返回[[0,1], [2,3]]
  • getIntervalls(6, 2)应该返回[[0,3], [4,6]]
  • getIntervalls(8, 3)应该返回[[0,2], [3,5], [6,8]]
  • getIntervalls(9, 3)应该返回[[0,3], [4,7], [8,9]]

这是我的功能:

function getIntervalls(max, nbIntervalls) {

    var size = Math.ceil(max / nbIntervalls);
    var result = [];

    if (size > 1) {
      for (let i = 0; i < nbIntervalls; i++) {
        var inf = i + i * size;
        var sup = inf + size < max ? inf + size: max;

        result .push([inf, sup]);
      }
    } else {
      result.push([0, max]);
    }

    return result;
}

console.log(JSON.stringify(getIntervalls(7, 2)));

它正常工作,并显示此输出:

[[0,4],[5,7]]

当我将参数更改为7和3时,它显示:

[[0,3],[4,7],[8,7]]

而不是

[[0,2],[3,5],[6,7]]

有人可以帮助我吗?先感谢您。 ES6语法将不胜感激! :)

3 个答案:

答案 0 :(得分:4)

您需要使用Math.round()获取最近的size间隔的十进制数的整数。此外,您需要减少一个max size计算,以考虑有效的间隔数。

这里修改了你的代码:

function getIntervalls(max, nbIntervalls) {
    var size = Math.round((max-1) / nbIntervalls);
    var result = [];

    for (let i = 0; i < nbIntervalls; i++) {
        var inf = i + i * size;
        var sup = inf + size < max ? inf + size: max;

        result.push([inf, sup]);
        if(inf >= max || sup >= max)break;
    }
    return result;
}

请注意它尊重所需的间隔数,因此可能会出现一些数字的情况 [..., [n-2,n-1], [n,n]]

希望这有帮助!

答案 1 :(得分:2)

您需要将尺寸计算从Math.ceil()更改为Math.floor(),因为ceil所需的尺寸+1大于您的需要。

我已对您的代码进行了修改,此处可以使用。

function getIntervalls(max, nbIntervalls) {

    var size = Math.floor(max / nbIntervalls);
    var result = [];

    if (size > 0) {
      for (let i = 0; i < nbIntervalls; i++) {
        var inf = i + i * size;
        var sup = inf + size < max ? inf + size : max;

        result .push([inf, sup]);
        if (sup >= max) {
          break;
        }
      }
    } else {
      result.push([0, max]);
    }

    return result;
}

console.log(JSON.stringify(getIntervalls(10, 5)));

希望这有帮助!

答案 2 :(得分:1)

您可以检查第一个元素的Microsoft.NETCore.UniversalWindowsPlatform是否为零,如果下一个增量大于第二个元素的最大值。您还可以检查第一个元素是否小于最大值

&#13;
&#13;
i
&#13;
&#13;
&#13;