我不知道如何解释这一点。一个例子似乎是最简单的方法:
[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]
添加两个数组的每个元素。如果某个元素都在两个数组中,则在单个数组中添加该元素的最大数量。生成的数组不需要以任何特殊方式排序,但为了便于阅读,我在这里做了。
注意,这将用于具有未知整数值的大数组。有没有一种好的方法可以做到这一点,不需要太多的时间/处理能力?
答案 0 :(得分:0)
<强>算法:强>
将最小的数组复制到解决方案数组中。
遍历另一个数组。
如果找到新元素=&gt;
使用此链接计算元素在另一个数组Count how often a particular value appears in an array中出现的次数。添加相同的内容。
如果找到的元素已存在于结果数组中,请找到该元素的计数。
if(在其他数组中计算&gt; =结果数组中的count)
将(在其他数组中计数 - 在结果数组中计数)*元素添加到结果数组。
其他:什么都不做。
这是上述算法的工作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
)
我是否回答了你的问题?
答案 1 :(得分: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);
?>
答案 2 :(得分: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]
中的所有数字。
答案 3 :(得分: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);