代码解读

a.php
function merge(&$nums1, $m, $nums2, $n) {
    // 从后往前比较并填充
    $i = $m - 1;     // nums1的最后一个有效元素
    $j = $n - 1;     // nums2的最后一个元素
    $k = $m + $n - 1; // 合并后的最后一个位置
    
    while ($i >= 0 && $j >= 0) {
        if ($nums1[$i] > $nums2[$j]) {
            $nums1[$k--] = $nums1[$i--];
        } else {
            $nums1[$k--] = $nums2[$j--];
        }
    }
    
    // 如果nums2还有剩余元素
    while ($j >= 0) {
        $nums1[$k--] = $nums2[$j--];
    }
}
$nums1 = [1,2,3,0,0,0];
$m = 3;
$nums2 = [2,5,6];
$n = 3;

merge($nums1, $m, $nums2, $n);
print_r($nums1); // 输出: Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 5 [5] => 6 )
}

太史公曰:这里定义了一个函数,目的是两个数组的合并,都是有序的数组,数组1的元素并不都是有效的,告诉你有效位数是多少,剩下的是0,代表数组2的有效位数吗,第2个数组的有效位数有意义吗,也就是说合并之后的数组1中的最后几个元素也可能是0,也就是说用不到,那么数组2的有效位数就有意义,题目告诉你了不能使用新数组,要在数组1的基础上处理,怎么做呢,无非就是把一部分的0替换掉,现在是从后往前比较的,能反过来吗,或者说这个先不考虑,先看看目前的这种写法,从后往前,也就是说最大的在后面,哪个更大呢,开始比较,数组1中有效的最后1个,数组2中有效的最后1个,比较,大的怎么样呢,赋值,替换,下标是多少呢,m+n-1,但是这个是活的,所以要往前递减,整体来讲,是对数组1的重新赋值,下标是固定的,或者说是可知的,就这么多,往前推就行,这里用到了循环,元素是有多个,需要比较多次,循环的条件是什么呢,既然是从后往前的,递减的,最小的是0,比较的结果呢,要么大,要么小,取哪个呢,因为是从后往前的,先找大值,所以取大的,这样就处理完了吗,没有,接下来还有一段代码,处理的是什么呢,因为现在的比较是两两比较,你的最后一个,对应它的最后一个,倒数第二个对应它的倒数第二个,比较完了,有剩余怎么办,比如说数组1有两个元素,数组2有三个,是不是不对,两两比较的话,确定的值是两个才对,比如说数组1是1,2,数组2是3,4,5,最后一个比较,2和5,大的是5,然后把5赋值,接下来比较1和4吗,然后把4赋值,数组1已经没有元素了,比较完了,确定了5,4,而数组2只剩下1个了,应当有5个元素才对,剩下的2个呢,你是不是想到了什么,整体处理的还是数组1,数组1里的元素本来就是有值的,也就是说1,2还在原来的位置,假如说比较之后他们是小值的话,重新赋值的是后面为0的,所以,这种写法是对的,接着说吧,数组2还有元素,那么继续赋值,然后结束

整体来讲,怎么说呢,你能感到这种写法是对的,但是让你自己写,你又写不出来,也就是说你写代码,你没有天赋,只是平庸而已,这不是你擅长的,你没有才能,让你解读,你解读的还不一定对,看起来很绕,估计也是很烧脑子吧,是不是也有点啰嗦,你费半天解读的,可能对大神来说只是理所当然,你能看到你的未来吗,一个小菜鸡吗,也行这不是你擅长的,要剑走偏锋,无人能敌吗,可是天外有天,不是吗,要算了吗,也就是说有局限