2

我不知道如何解释这一点。一个例子似乎是最简单的方法:

[1, 4, 7, 3, 3, 3] and [4, 0, 3, 4, 9, 9]
should give [0, 1, 3, 3, 3, 4, 4, 7, 9, 9]

添加两个数组的每个元素。如果某个元素在两个数组中,则在单个数组中添加该元素的最大数量。生成的数组不需要以任何特殊方式排序,但我在这里这样做是为了便于阅读。

请注意,这将用于具有未知整数值的大数组。有没有一种不需要太多时间/处理能力的好方法?

4

4 回答 4

0

可能不是最优化的,但

<?php
$one=[1, 4, 7, 3, 3, 3];
$two=[4, 0, 3, 4, 9, 9];
sort($one);
sort($two);
foreach($one as $el)
{
$combined[]=$el;
if (array_search($el,$two))
{
unset($two[array_search($el,$two)]);
}
}
foreach($two as $el)
{
$combined[]=$el;
}
sort($combined);
print_r($combined);
?>
于 2013-08-06T03:37:11.673 回答
0
$count[0] = array_count_values($arr1);
$count[1] = array_count_values($arr2);
$out = array();
array_map(function($e) use(&$out, $count){
    $n1 = (isset($count[0][$e])) ? $count[0][$e] : 0;
    $n2 = (isset($count[1][$e])) ? $count[1][$e] : 0;
    $next = ($n2 > $n1) ? array_fill(0, $n2, $e) : array_fill(0, $n1, $e);
    $out = array_merge($out, $next);
}, array_keys($count[0] + $count[1]));
print_r($out);
于 2013-08-06T12:12:04.360 回答
0

算法:

  1. 将最小的数组复制到解决方案数组中。

  2. 遍历另一个数组。

  3. 如果找到新元素=>

    使用此链接计算元素在另一个数组中出现的次数计算特定值在数组中出现的频率。添加相同。

  4. 如果在结果数组中找到已存在的元素,则查找该元素的计数。

    如果(其他数组中的计数> =结果数组中的计数)

    添加(其他数组中的计数 - 结果数组中的计数)*元素到结果数组。

    其他:什么都不做。

这是上述算法的工作 php 实现:

<?php
$a1=[1, 4, 7, 3, 3, 3];
$a2=[4, 0, 3, 4, 9, 9];
$size=sizeof($a1);
$result=$a1;
foreach ($a2 as $value)
{
if(in_array($value,$result))
{
    $p=array_count_values($a2)[$value] ;
    $q=array_count_values($result)[$value] ;
    if($p>$q)
     {
         $temp=array_fill(0, $p-$q  , $value);
         $result=array_merge($result,$temp);
     }
}
else
{
    $temp=array_fill(0,array_count_values($a2)[$value],$value);
    $result=array_merge($result,$temp);
}
}
print_r($result);

?>

这是输出:

Array
(
    [0] => 1
    [1] => 4
    [2] => 7
    [3] => 3
    [4] => 3
    [5] => 3
    [6] => 4
    [7] => 0
    [8] => 9
    [9] => 9
)

我回答你的问题了吗?

于 2013-08-06T03:27:51.977 回答
0

尝试这个:

<?php

$array1 = [1, 4, 7, 3, 3, 3];
$array2 = [4, 0, 3, 4, 9, 9];

function min_merge($arr1, $arr2) {
    $arr1 = array_count_values($arr1);
    $arr2 = array_count_values($arr2);

    foreach ($arr2 as $index => $arr)
        if (!isset($arr1[$index]) || $arr > $arr1[$index])
            $arr1[$index] = $arr;

    foreach ($arr1 as $index => $arr)
        for ($i = 0; $i < $arr; $i++)
            $final[] = $index;

    return $final;
}

print_r(min_merge($array1, $array2));

输出

Array (
    [0] => 1
    [1] => 4
    [2] => 4
    [3] => 7
    [4] => 3
    [5] => 3
    [6] => 3
    [7] => 0
    [8] => 9
    [9] => 9 
)

未排序,但它包含来自 的所有数字[0, 1, 3, 3, 3, 4, 4, 7, 9, 9]

于 2013-08-06T03:40:04.097 回答