【问题标题】:Create an Array with the numbers needed to sum a specific number [duplicate]创建一个数组,其中包含对特定数字求和所需的数字[重复]
【发布时间】:2019-11-15 02:09:23
【问题描述】:

我想创建一个数组,其位置的总和作为结果给出特定数字。

较大的数字必须从数组的开头填充,如果需要则填充为 0,并尽可能均匀地分布。

例如一些场景的预期结果:

const array = new Array(4);
const number = 4;
// Expected result -> [1, 1, 1 ,1]
const array = new Array(5);
const number = 17;
// Expected result -> [4, 4, 3, 3 ,3]
const array = new Array(7);
const number = 2;
// Expected result -> [1, 1, 0, 0, 0, 0, 0]

使用 Javascript 获取此数组的最有效方法是什么?

请注意,这些示例的数量很少。一个真实的例子会使用更大的数字,例如:

const array = new Array(52);
const number = 3215654;

关于可能的重复问题,这个问题需要与其他用户指出的问题不同的结果顺序,因此这里的逻辑不可行。

【问题讨论】:

  • 如果您在一定的性能成本下欣赏简洁,您可能会喜欢this

标签: javascript arrays node.js


【解决方案1】:

出于纯粹的好奇心,我想尝试一下,这是我想出的:

const arrayLength = 5;
let number = 17;

const arr = [];
for(let i=arrayLength; i>0; i--){
  const n = Math.ceil(number/i);
  arr.push(n);
  number -= n;
}
console.log(arr);//[ 4, 4, 3, 3, 3 ]

将数字分成相等的部分似乎是答案。

【讨论】:

  • 这很棒而且速度很快。谢谢!!
【解决方案2】:

您可以创建一个将您的两个约束作为参数的函数。 在该函数中,您创建一个简单的循环来迭代您的 targetLength。

  • 计算 targetVal 的“偶数”部分。
  • 将该部分推到 结果数组。
  • 从 targetValue 中减去该部分。
  • 重复直到长度为 0

一个简单的例子可能如下所示:

function buildArray(length, target) {
    let result = [];
    for(; length > 0; length--) {
        let val = Math.ceil(target/length);
        result.push(val);
        target -= val;
    }
    return result;
}

buildArray(4, 4); // -> [1, 1, 1, 1]
buildArray(5, 17); // -> [4, 4, 3, 3, 3]
buildArray(7, 2); // -> [1, 1, 0, 0, 0, 0, 0]

编辑: 根据您在编辑中提供的示例,结果应该是

buildArray(52, 3215654); // ->[61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61840, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839, 61839]

【讨论】:

    【解决方案3】:

    您可以为此使用 array.map,这将为您提供您期望的结果。

    const count = 7;
    const number = 6;
    
    const array = [...(new Array(count)).keys()];
    
    let result = array.map((v,index) => {
        return Math.floor(number / array.length) + (index < (number % array.length) ? 1:0) ;
    });
    
    console.log("Result: ", result);

    【讨论】:

    • 这种方式可行,但这种解决方案的执行速度比其他解决方案慢。还是谢谢!
    【解决方案4】:

    使用Array.fill 创建一个用零填充的数组,然后执行循环来放置值:

    const arrayLength=5;
    const number = 17;
    var exArray=new Array(arrayLength).fill(0);
    for(var i=0,j=0;i<number;i++,j++){
       if(j>=arrayLength) j=0;
       exArray[j]++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2016-12-08
      • 2017-12-07
      • 1970-01-01
      • 2014-04-23
      • 2021-03-02
      • 2012-01-06
      相关资源
      最近更新 更多