我需要编写一个函数,当我有一个数字从-10到10(没有0)的n个数组时,返回数组中对的数量,总和为0。
例如: $ input = array( 3 ,6, -3 ,5, -10 ,3, 10 ,< strong> 1 , 7 , -1 , - 9,-8, 7 ,7, -7 < / strong>, - 2, -7 );
在示例中,正确答案是5(对是粗体)
我发现了类似的东西:<?php
$array = [3, 6, -3, 5, -10, 3, 10, 1, 7, -1, -9, -8, 7, 7, -7, -2, -7];
function pairs($array=[]){
$copy = $array;
$arrayLength = count($copy);
$pairs=0;
while($arrayLength!=0){
$a = array_values($array)[0];
$b = -$a;
for( $i=1 ; $i==$arrayLength ; $i++ ){
if($array[$i]==$b){
unset($array[$i]);
$pairs++;
$arrayLength--;
}
else{
unset($array[$i]);
$arrayLength--;
}
}
return $pairs;
}
unset($copy);
}
var_dump(pairs($array));
?>
答案 0 :(得分:2)
试试这个:
function pairs($array=[]){
$pairs = [];
// counting the positive and negative of each number in the set
foreach($array as $v){
$av = abs($v);
if(!isset($pairs[$av]))
$pairs[$av] = [
'pos' => 0,
'neg' => 0
];
($v > 0) ? $pairs[$av]['pos']++ : $pairs[$av]['neg']++;
}
$pair_count = 0;
// getting the number of pairs for each number, based on those counts
foreach($pairs as $pair){
$pair_count += min($pair['pos'],$pair['neg']);
}
return $pair_count;
}
<强> DEMO 强>
这消除了每次取消设置时重建数组索引的烦人需求(部分问题来自你提供的函数的来源),并且还使得它只需要循环两次,因此效率更高,特别是对于大型数据集。