之前去面试需要先做一道题才能拿到面试资格,于是耗费半天时间没答上来。。。回来后百度了一下,找到了一个答案:https://blog.csdn.net/hu_zhe_kan/article/details/101030729,但是有点小问题,然后修改了一下。以下是题和答案:
要求:
- D的每个元素也是递增(a1 <= a2,不用去重)
- 不使用api.
- 时间复杂度O(N),本题N=25,所以只能循环25次; 空间复杂度O(1),除合并输出的空间$arrayD外,额外的空间大小不能与N相关。
代码:
<?php
$arrayA = [52, 63, 64, 75, 86, 89, 110];
$arrayB = [76, 79, 310, 311, 413, 515];
$arrayC = [12, 13, 14, 27, 29, 40, 42, 43, 54, 57, 99, 1110];
function mergeArr($arrA, $arrB, $arrC)
{
$arrayD = [];
$a = 0;
$b = 0;
$c = 0;
$endpoint = end($arrA) + end($arrB) + end($arrC);
//循环25次
//每次给arrayD 一个当前最小的值 tmp,
//默认给拿第一个数组的第一个元素 .
//通过比较$arrA[$a],$arrB[$b],$arrC[$c]大小,最小的赋值给tmp,并且把最小的index+1
for ($i = 0; $i < 25; $i++) {
$tmp = $arrA[$a]; //每次都临时认为$arrA[$a]最小 可以避免用tmp和$arrA[$a]去做比较
//如果a>b 当前最小的为b
if ($tmp > $arrB[$b]) {
//再拿b去和c比较,如果c小 tmp=c
if($arrB[$b] > $arrC[$c]){
$tmp = $arrC[$c];
if ($c < count($arrC)-1) {
++$c;
}else{
$arrC[$c] = $endpoint;
}
}else{
//如果b<c则说明最小的是b
if ($b < count($arrB)-1) {
++$b;
}else{
$arrB[$b] = $endpoint;
}
}
} elseif ( $tmp > $arrC[$c]) {
$tmp = $arrC[$c];
if ($c < count($arrC)-1) {
++$c;
}else{
$arrC[$c] = $endpoint;
}
} else {
if ($a < count($arrA)-1) {
++$a;
} else {
$arrA[$a] = $endpoint;
}
}
$arrayD[$i] = $tmp;
}
return $arrayD;
}
echo "<pre>";
print_r(mergeArr($arrayA, $arrayB, $arrayC));
输出结果:
Array
(
[0] => 12
[1] => 13
[2] => 14
[3] => 27
[4] => 29
[5] => 40
[6] => 42
[7] => 43
[8] => 52
[9] => 54
[10] => 57
[11] => 63
[12] => 64
[13] => 75
[14] => 86
[15] => 86
[16] => 86
[17] => 89
[18] => 99
[19] => 110
[20] => 1735
[21] => 1735
[22] => 1735
[23] => 1735
[24] => 1110
)
以下是一个更加容易理解的方法,自己想的:
<?php
$arrayA = [52, 63, 64, 75, 86, 89, 110];
$arrayB = [76, 79, 310, 311, 413, 515];
$arrayC = [12, 13, 14, 27, 29, 40, 42, 43, 54, 57, 99, 1110];
function mergeArr($arrayA,$arrayB,$arrayC){
$arrayD = [];
$a_max = max($arrayA[count($arrayA)-1],$arrayB[count($arrayB)-1],$arrayC[count($arrayC)-1]);
$max_num = $min = $a_max+1;
$max = count($arrayA)+count($arrayB)+count($arrayC);
$a = null;$b = null;$c = null;
for($i =0; $i<$max; $i++)
{
if($a == null){
$a = empty($arrayA)?$max_num:array_shift($arrayA);
}
if($b == null){
$b = empty($arrayB)?$max_num:array_shift($arrayB);
}
if($c == null){
$c = empty($arrayC)?$max_num:array_shift($arrayC);
}
$min = $a < $b ?($a < $c ? $a : $c) : ($b < $c ? $b :$c);
if($min == $a){
$a = null;
$arrayD[] = $min;
}
if($min == $b){
$b = null;
$arrayD[] = $min;
}
if($min == $c){
$c = null;
$arrayD[] = $min;
}
}
print_r($arrayD);
}
mergeArr($arrayA,$arrayB,$arrayC);
下面是结果
Array
(
[0] => 12
[1] => 13
[2] => 14
[3] => 27
[4] => 29
[5] => 40
[6] => 42
[7] => 43
[8] => 52
[9] => 54
[10] => 57
[11] => 63
[12] => 64
[13] => 75
[14] => 76
[15] => 79
[16] => 86
[17] => 89
[18] => 99
[19] => 110
[20] => 310
[21] => 311
[22] => 413
[23] => 515
[24] => 1110
)