【问题标题】:how to compare the elemnts of an array [closed]如何比较数组的元素[关闭]
【发布时间】:2016-04-16 22:43:34
【问题描述】:

给定一个非空数组,如果存在分割数组的地方,则返回true,使得一侧的数字之和等于另一侧的数字之和。

【问题讨论】:

  • 我猜是作业!那么您是否尝试过自己做任何事情,或者您只是想让别人为您做这件事?
  • 欢迎来到 SO。请阅读What topics can I ask aboutHow to ask a good question。 SO 不是免费的编码或教程服务。你必须表明你已经为解决自己的问题付出了一些努力。
  • 那么您尝试过做什么?你写了什么代码?它在什么方面不起作用?
  • 该代码转储与您的原始问题有何关系?
  • How to ask about homework。真诚地尝试自己先解决问题。询问您现有实施的具体问题。承认问题是家庭作业。请注意有关外部帮助的学校政策。永远不要使用你不理解的代码。

标签: php arrays


【解决方案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)

【讨论】:

  • 请对答案的内容而非问题进行投票。 (非常好的答案!,尽管我不会回答这么低质量的问题)
  • 是的,我知道,但我想写点东西。有人可能会偶然发现它并发现它很有帮助。
【解决方案2】:

(假设我们的输入数组包含数字。)

首先将数组的所有元素相互相加(总和)。然后遍历数组并将每个元素彼此相加(累积和)。如果在我们的迭代过程中,我们发现我们的累积和等于总和的一半,我们知道数组的其他成员也将加起来是一半,因此可以拆分数组。

<?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

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
猜你喜欢
  • 2022-12-17
  • 2021-12-24
  • 1970-01-01
  • 2021-12-05
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多