成对相反的价值观

时间:2015-11-03 21:59:01

标签: php arrays function

我需要编写一个函数,当我有一个数字从-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));
?>

1 个答案:

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

这消除了每次取消设置时重建数组索引的烦人需求(部分问题来自你提供的函数的来源),并且还使得它只需要循环两次,因此效率更高,特别是对于大型数据集。