如何避免使用双循环来改进这种方法?

我在一次采访中被要求在没有嵌套 for 循环的情况下重写这个方法。除此之外,我只知道数组的大小相同。什么是解决这个问题的好方法?

public int addTwo(int[] first, int[] second) {
    int result = 0;
    for (int k : first) {
        for (int i : second) {
            result += k * i;
        }
    }
    return result;
}

回答

如果我们记得 Matematics,如果在第一个数组中我们有k1, k2, k3,在第二个数组中我们有i1,i2,i3,那么结果k1 * i1 + k1 * i2 + k1 * i3 + k2 * i1 + ...

所以我们可以看到,我们应该重构这个数学表达式,如 k1 * (i1 + i2 + i3) + k2 * (i1 + i2 + i3) + k3 * (i1 + i2 + i3)

并且k1 * (i1 + i2 + i3) + k2 * (i1 + i2 + i3) + k3 * (i1 + i2 + i3) = (k1 + k2 + k3) * (i1 + i2 + i3)

因此,您可以将代码重构为

public int addTwo(int[] first, int[] second) {
    int firstSum = 0;
    int secondSum = 0;

    for (int k : first) {
        firstSum += k;            
    }

    for (int i : second) {
        secondSum += i;
    }

    return firstSum * secondSum;
}

  • And `k1 * (i1 + i2 + i3) + k2 * (i1 + i2 + i3) + k3 * (i1 + i2 + i3)` = `(k1 + k2 + k3) * (i1 + i2 + i3)` so both multiplication loops can be eliminated.

以上是如何避免使用双循环来改进这种方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>