首页 > 解决方案 > 迭代数组并对每个元素求和 1

问题描述

我在尝试解决数组问题时遇到了一些问题。好吧,我有一个这样的整数数组和一个要添加的块:

var model = [1,2,1,0,1]; var block = 1;

现在我必须给每个元素加 1 一次,我应该得到这样的结果:

[1,2,1,0,1] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] = [1,2,1,0,2]

结果应该是一个 5x5 的数组。当我必须添加超过 1 次的迭代时,问题会变得更加复杂。

var model = [1,2,1,0,1]; var block = 2;

现在我有相同的数组,但我必须以这种方式添加 2 个块:

[1,2,1,0,1] + [0,0,0,0,0] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [0,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [0,0,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [0,0,0,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,0] = [1,2,1,0,2]

[1,2,1,0,1] + [0,0,0,0,0] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [1,0,0,0,0] = [3,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [1,0,0,0,0] = [2,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [1,0,0,0,0] = [2,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [1,0,0,0,0] = [2,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [1,0,0,0,0] = [2,2,1,0,2]
     .             .             .             .
     .             .             .             .
     .             .             .             .
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,1] = [1,2,1,1,2]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,1] = [1,2,1,0,4]

我有一个解决第一部分的函数,当我必须迭代 1 个块时我可以做到。像这样:

    function iterateOneBlock(in_array){

       n_out_array = [];

       for(i=0; i<in_array.length; i++){
            tmp_array = in_array;
            tmp_array[i]++;
            n_out_array[i] = tmp_array;
       }
       return n_out_array;
    }

    const myarray = [1,2,1,0,1];
    var myarrayofarray = iterateOneBlock(myarray);

    console.log(myarrayofarray);

标签: javascriptarraysnode.js

解决方案


您也可以使用递归函数来做到这一点。在下面的代码中有 3 个简单的函数,

arsum(ar1,ar2)计算两个数组的总和ar1&ar2

getArr(n,i)返回一个大小数组,n其所有元素都为零,除了原位i(即1

iterateNBlock(inArray, block)是起点

calculate(arrayOfArray, block)是递归函数。当block===0输入数组是结果时。

在您的示例中,当块为 1 时,您计算一些数组作为结果,而当块为 2 时,您对所有这些数组执行操作,对第一个数组执行的操作。

所以对于block=n你做同样事情时的结果block=n-1

function arsum(ar1, ar2){
    let sum = [];
    for(let i=0; i<ar1.length; i++){
        sum.push(ar1[i]+ar2[i]);
    }
    return sum;
}
function getArr(n,i){
    let ar = new Array(n).fill(0);
    if(i>=0 && i<ar.length)
        ar[i]=1;
    return ar;
}
function calculate(arrayOfArray, block){
    if(block===0)return arrayOfArray;

    let n = arrayOfArray[0].length;
    let next = [];

    for(let i=-1; i<n; i++){
        let ar = getArr(n, i);
        for(let j=0 ; j<arrayOfArray.length; j++){
            next.push(arsum(arrayOfArray[j], ar));
        }
    }
    return calculate(next, block-1);
}
function iterateNBlock(inArray, block){
    return calculate([inArray], block);
}

有点难解释,希望能帮到你!!!


推荐阅读