数组匹配计数比预期少一

时间:2019-05-22 10:09:32

标签: php

$ar是一对袜子。 $n$ar中的项目数。我必须将数组中的每个数字与另一个(如果它们匹配)匹配,即一对。然后,我必须返回匹配项的计数。我在下面做了,但是答案比应该的少了一个。例子

n:9

ar: 10 20 20 10 10 30 50 10 20

我得到输出2而不是3。

function sockMerchant($n, $ar) {
    $pair =0;
    $j=0;
    for($i=0; $i< count($ar); $i++)
    {
        for($j=$i+1; $j< count($ar); $j++)
        {
            if ( isset( $ar[$j]) && isset( $ar[$i])) {
                if ($ar[$i]== $ar[$j])
                {
                    unset($ar[$i]);
                    unset($ar[$j]);
                    $pair+=1;
                    $i=0;
                    break;
                }
            }

        }
    }
    return  count($ar);
}

5 个答案:

答案 0 :(得分:2)

代替您正在做的事情是实现这一目标的捷径,

$temp = array_count_values($arr); // count number of occurences
echo count(array_filter($temp, function($value){ // filter in not greater than 1 
    return $value > 1;
}));

以上代码段将为您提供不仅只有一次的所有配对。

这是您的摘要的另一种选择,

$temp = array_count_values($arr); // count number of occurences
$e    = array_reduce($temp, function ($carry, $item) {
    $carry += ($item > 1 ? intval($item / 2) : 0);
    return $carry;
});
echo $e;die;

工作demo

答案 1 :(得分:0)

如果您想要匹配对总数,则应该返回$pair。但是您返回的count($ar)在所有可能的情况下都不正确。检查下面的代码以及输出和新数据集:

<?php
function sockMerchant($n, $ar) {
    $pair =0;
    $j=0;
    for($i=0; $i< $n; $i++)
    {
        for($j=$i+1; $j< $n; $j++)
        {
            if ( isset( $ar[$j]) && isset( $ar[$i])) {
                if ($ar[$i]== $ar[$j])
                {
                    unset($ar[$j]);
                    unset($ar[$i]);
                    $pair+=1;
                    $i=0;
                    break;
                }
            }

        }
    }
    echo '<pre>'; print_r($ar);
    return  $pair.'--'.count($ar);
}

$a = [10, 20, 20, 10, 10, 30, 50, 10, 20, 80, 40];
$n = 11;
$b = sockMerchant($n, $a);

var_dump($b);

// Output:
/*
Array
(
    [5] => 30
    [6] => 50
    [8] => 20
    [9] => 80
    [10] => 40
)
string(4) "3--5"
*/

?>

Demo

答案 2 :(得分:0)

$ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];

$pairIndex = [];
$count = 0;

foreach ($ar as $key => $item) {
    // Start comparing from the next element
    for ($i = ($key + 1); $i < count($ar); $i++) {
        if ($item == $ar[$i] && !in_array($key, $pairIndex)) {
            $pairIndex[] = $key;
            $pairIndex[] = $i;
            $count++;
        }
    }
}

echo "Pairs: " . $count;

答案 3 :(得分:0)

这将为您提供对数。

$arr = array(10, 20, 20, 10, 10, 30, 50, 10, 20);

$counts = array_count_values($arr); // count number of occurences
array_walk($counts, function(&$x) {$x = intdiv($x, 2);}); //divide each element
    //by 2 (integer division), so now you have pairs of each element
echo array_sum($counts); //sum the pairs

使用您的初始数组,它回显3。

答案 4 :(得分:0)

一个简单的例子,数组会发生什么:

$ar = array(0, 10, 20, 30, 40, 50 , 60, 70, 80, 90);
$lnPointer = 2;
print_r($ar);
// Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 30 [4] => 40 [5] => 50 [6] => 60 [7] => 70 [8] => 80 [9] => 90 ) 
echo "<HR>";
echo $ar[$lnPointer];
echo "<HR>";
unset( $ar[$lnPointer]);
print_r($ar);
// Array ( [0] => 0 [1] => 10 [3] => 30 [4] => 40 [5] => 50 [6] => 60 [7] => 70 [8] => 80 [9] => 90 ) 
echo "<HR>";
echo $ar[$lnPointer];

取消设置后,您将获得未定义的索引