如何避免使用双循环来改进这种方法?
我在一次采访中被要求在没有嵌套 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.