给定非空数组,如果有一个分割数组的位置,则返回true,使得一侧数字的总和等于另一侧数字的总和。
答案 0 :(得分:1)
将问题分解为更小的问题。
我们将使用的数组是:
$array = [1, 2, 3, 4, 5];
第一件事:
了解问题
为了比较左侧和右侧,您需要拆分阵列,直到两侧的总和相等,或者直到没有其他项目相加。
在视觉上看起来像这样:
• ••••
•• •••
••• ••
•••• •
问题:可以将数组拆分为两部分吗?
总是一个好主意,要弄清楚你想要做的事情是否可行,或者这样做是否有意义。
有了这个问题,我们需要在数组中至少有2个项目才能将它分成两部分。因此,如果数组少于2个项目,那么我们可以安全地返回false
并将其称为一天:
if (count($array) < 2) {
return false;
}
问题:如何浏览数组
需要在数组中的每个项之后拆分数组。所以,我们需要逐项遍历数组。
| • | • | • | • | • |
0 1 2 3 4 5
我们只需要将数组拆分为1,2,3和4.换句话说,我们应该在第一个项目之后开始并在最后一个项目之前停止:
$length = count($array);
for ($i = 1; $i < $length; $i++) {
echo "Split after {$i}\n";
}
问题:如何从数组中获取左/右侧
获取左侧和右侧是从阵列中提取它们的简单方法。
$left = array_slice($array, 0, $i);
$right = array_slice($array, $i);
如果你将它放入循环并输出它,你会得到这样的结果:
1 | 2 3 4 5
1 2 | 3 4 5
1 2 3 | 4 5
1 2 3 4 | 5
问题:总结并比较
PHP有一个array_sum()
函数,它对数组中的值求和:
if (array_sum($left) === array_sum($right)) {
return true;
}
一个解决方案
function my_func($array) {
if (count($array) < 2) {
return false;
}
$length = count($array);
for ($i = 1; $i < $length; $i++) {
$left = array_slice($array, 0, $i);
$right = array_slice($array, $i);
if (array_sum($left) === array_sum($right)) {
return true;
}
}
return false;
}
var_dump(my_func([1, 2, 3, 4, 5])); // false
var_dump(my_func([7, 1, 2, 3, 1])); // true: 7 = (1 + 2 + 3 + 1)
答案 1 :(得分:-1)
(假设我们的输入数组包含数字。)
首先将数组的所有元素相互添加(总和)。然后遍历数组并在我们去的时候将每个元素相互添加(累积和)。如果在我们的迭代过程中我们发现我们的累积和等于总和的一半,我们知道数组的其他成员也会加起来一半,因此可以拆分数组。
<?php
function can_split(array $numbers) {
$total_sum = array_sum($numbers);
$half_sum = $total_sum / 2;
$cumulative_sum = 0;
foreach($numbers as $num) {
$cumulative_sum += $num;
if($cumulative_sum == $half_sum)
return true;
}
}
var_dump(can_split(array(1))); // null
var_dump(can_split(array(1,2,3))); // true
var_dump(can_split(array(10,1,9))); // true
var_dump(can_split(array(3,5,9))); // null
var_dump(can_split(array(1.5,2,3,3,3.5))); // true