1 回答
TA贡献1816条经验 获得超4个赞
如果可以除法,为什么要乘法?
$arr = [1,2,3,4];
$product = array_product($arr);
$multiples = array_map(function($el) use ($product) { return $product / $el; }, $arr);
// var_dump($multiples);
// array(4) { [0]=> int(24) [1]=> int(12) [2]=> int(8) [3]=> int(6) }
var_dump(array_sum($multiples));
简而言之,想法是a * b * c
等于a * b * c * d / d
, a * b * d
isa * b * c * d / c
等。唯一需要注意的是,当您处理大数时,可能会发生一些溢出,但这很容易在$product
计算步骤中发现。
好的,事实证明该任务比描述中提到的要多。如果是这种情况,并且您想要一个通用的解决方案,您可以考虑先创建所需所有元素的排列,然后计算所有排列的所有乘法之和。
尽管如此,对于这种特殊情况——“取一对元素,将它们相乘,然后计算总和”——还有另一个 O(n) 解决方案:
$arr = [1,2,3,4];
$sum = array_sum($arr);
$sum_of_multiples = array_reduce($arr, function($carr, $item) use (&$sum) {
return $carr + $item * ($sum -= $item);
}, 0);
var_dump($sum_of_multiples); // int(35)
它基于一个简单的事实,即对于数组的每个单独元素,涉及它的倍数之和就是该元素乘以所有其他元素的总和。
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报