总结来自2个数组

时间:2015-06-19 05:41:56

标签: javascript arrays sum element

我试图理解这个条件循环来总结来自2个数组的每个元素,但我偶然发现后者,我不明白在那里要实现的目标。

你可以向我解释一下吗?

function Arrays_sum(array1, array2) {
    var result = [];
    var ctr = 0;
    var x = 0;

    if (array1.length === 0)
        return "array1 is empty";
    if (array2.length === 0)
        return "array2 is empty";

    while (ctr < array1.length && ctr < array2.length) {
        result.push(array1[ctr] + array2[ctr]);
        ctr++;
    }

    if (ctr === array1.length) //I don't understand from here onwards
    {
        for (x = ctr; x < array2.length; x++) {
            result.push(array2[x]);
        }
    } else {
        for (x = ctr; x < array1.length; i++) {
            result.push(array1[x]);
        }
    }

    return result;
}

3 个答案:

答案 0 :(得分:1)

让我们假设以下两个数组及其&#34;总和&#34;:

Array 1: 1  2  3  4   5  6   7   8  9 [length = 9]
Array 2: 2  4  6  8   2  4   6        [length = 7]

Sum    : 3  6  9  12  7  10  13  8  9 [length = 9]

注意最后两项。总和等于第一个数组的值,因为第二个数组不包含这样的数值。

Array 1: 1  2  3  4   5  6   7   8  9
Array 2: 2  4  6  8   2  4   6   ?  ?

这正是算法的作用:

1)虽然两个数组都有i索引处的数字 - 总结。

ctr    : !  !  !  !   !  !   !  \|/   [ ctr   = 7 (remember: 0-based indexes)]       
Array 1: 1  2  3  4   5  6   7   8  9 [length = 9]
Array 2: 2  4  6  8   2  4   6        [length = 7]

Sum    : 3  6  9  12  7  10  13  

while (ctr < array1.length && ctr < array2.length)条件在ctr < array2.length处断开。

此外,检查ctr == array2.length返回true表示数组2结束,我们需要继续迭代array1

for (x = ctr; x < array1.length; i++) {
    result.push(array1[x]);
}

2)剩下的数组没有结束 - 从中​​添加值。

x    :                           !  !  \|/ [  x    = 10]                     
Array 1: 1  2  3  4   5  6   7   8  9      [length = 9 ]
Array 2: 2  4  6  8   2  4   6             [length = 7 ]

Sum    : 3  6  9  12  7  10  13  8  9

答案 1 :(得分:1)

在第一个循环结束时,以下断言成立:

ctr === array1.length || ctr === array2.length

请注意以下方案说明:

array1: xxxxxxx    (length = 7)
array2: xxxxxxxxxx (length = 10)
               ^
               7 (ctr)

如果已到达一个数组的末尾,它将继续从该点开始附加另一个数组的每个元素。当然,这假设每个数组边界之外的元素被认为是0

从技术上讲,通过考虑以下函数可以减少边缘情况:

array2 is empty => yield array1
array1 is empty => yield array2

那就是说,因为我们正在处理JavaScript,所以我们可以稍微改变一下CS规则:

function array_sum(a, b)
{
  // iterate over the biggest array and map each value
  return (a.length > b.length ? a : b).map(function(value, index) {
    // to the sum of both, whereby 0 is assumed for non-existent elements
    return value + (b[index] || 0);
  });
}

答案 2 :(得分:1)

正如你可以看到听到你正在使用的那样因为在while循环中你正在使用&amp;&amp;来检查两个数组。条件。

因此,如果假设 array1.length = 1 array2.length = 2 而您的 ctr = 1 ,则 while循环停止,但是array2还剩下一个值,因此对于剩余的值,他们使用 IF条件

nil.to_i #=> 0