所以,这个问题更多的是需要解释为什么某些代码可以工作而不是需要回答代码问题。我最近做了一个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循环会在Performance上杀了我,但在我去看看其他一些解决方案之前我想不出任何办法摆脱它。
这是我在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的方式吗?
答案 0 :(得分:0)
相似但不同,我找到的解决方案得分为100和100
function solution($A) {
// write your code in PHP7.0
$left_sum = 0;
$right_sum = array_sum($A);
foreach($A as $k => $v) {
if($k > 0) {
$left_sum += $A[($k -1)];
}
$right_sum -= $v;
if($left_sum === $right_sum) {
return $k;
}
}
return -1;
}