合并3个递增数组 A, B, C,输出到D保持递增

之前去面试需要先做一道题才能拿到面试资格,于是耗费半天时间没答上来。。。回来后百度了一下,找到了一个答案:https://blog.csdn.net/hu_zhe_kan/article/details/101030729,但是有点小问题,然后修改了一下。以下是题和答案:
要求:

  1. D的每个元素也是递增(a1 <= a2,不用去重)
  2. 不使用api.
  3. 时间复杂度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
)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值