【发布时间】:2016-11-14 03:23:22
【问题描述】:
所以,这个问题更多的是需要解释为什么某些代码可以工作,而不是需要回答代码问题。我最近做了一个 Codility 示例测试,你必须用任何所需的语言编写一个函数,该函数可以接受一个可变整数数组并返回数组中的每个索引,即平衡索引。我用 PHP 写了我的答案,得到了一个非常糟糕的分数,所以我去查看其他人的解决方案,发现一些效果很好并获得了满分,但是他们做了一些非常具体的事情,我无法弄清楚做出那个的数学逻辑飞跃。
首先,这是我为回答问题而编写的函数:
function solution($A) {
for($i=0; $i<=count($A); $i++){
$leftTotal = 0;
$rightTotal = 0;
for($j=0; $j<count($A); $j++){
if($j < $i && isset($A[$j])){
$leftTotal += $A[$j];
} else if($j > $i && isset($A[$j])) {
$rightTotal += $A[$j];
}
}
if($leftTotal === $rightTotal){
return $i;
}
}
return -1;
}
此答案的正确性得分为 95%,但性能得分仅为 18%。我知道嵌套 for 循环会在性能方面扼杀我,但在我去研究其他解决方案之前,我想不出任何办法来摆脱它。
这是我在this Github page找到的一个例子:
function equi($A) {
$lower_elements_sum = 0;
$higher_elements_sum = array_sum($A);
for ($i = 0, $cnt = count($A); $i < $cnt; $i++) {
if (isset($A[$i - 1])) {
$lower_elements_sum += $A[$i - 1];
}
$higher_elements_sum -= $A[$i];
if ($lower_elements_sum == $higher_elements_sum) {
return $i;
}
}
return -1;
}
所以,我了解这段代码所做的一切,并且在结构上,它与我所做的并没有什么不同。让我发疯的是他们如何知道为了获得平衡指数,他们可以从外到内完成整个函数,并启动他们的$higher_elements_sum 和传递给函数的数组的array_sum 值。
他们怎么知道会这样?我真的不得不在笔和纸上写下他们的函数结果以进行仔细检查,因为我无法从每次都必须找到左右值与他们所做的事情之间取得飞跃,并且只是不断建立相同的值左右合计。
谁能帮助我理解并填补我的答案和他们的答案之间的空白,因为我完全不知道如何从 A 到 B?
【问题讨论】: