如何比较数组的元素

时间:2016-04-16 22:43:35

标签: php arrays

给定非空数组,如果有一个分割数组的位置,则返回true,使得一侧数字的总和等于另一侧数字的总和。

2 个答案:

答案 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