我想创建一个数组,该数组的位置总和给出特定的数字。
必须从数组的开头填充较大的数字,并在需要时填充为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;
关于可能的重复问题,此问题需要与其他用户指出的问题不同的结果顺序,因此此处的逻辑不可行。
答案 0 :(得分:4)
出于好奇,我想尝试一下,这是我想出的:
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 ]
将数字均等似乎是答案。
答案 1 :(得分:2)
您可以创建一个将两个约束作为参数的函数。 在该函数内部,您创建了一个简单的循环来遍历targetLength。
一个简单的例子可能像这样:
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]
答案 2 :(得分:1)
您可以为此使用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);
答案 3 :(得分:0)
使用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]++;
}