PHP技术实现:找出使两数组相等的最小正整数及目标数组
解决PHP中通过添加最小正整数使两数组相等的问题
嗨,刚接触PHP不用慌,我来一步步帮你解决这个问题!针对你的需求,我们可以拆解成几个清晰的步骤来实现,还会帮你补全一些前提验证的细节,避免踩坑。
先理清楚需求逻辑
你的例子里,arr1=[1,1,7,2]和arr2=[1,13,2,1],排序后分别是[1,1,2,7]和[1,1,2,13],唯一的差异是7和13。差值是6,把这个正整数加到arr1的7上,两个数组就完全相等了,所以输出6 1。
核心要求是:
- 找到最小的正整数
- 确定要加到
arr1还是arr2的某个元素上 - 仅当两数组只有一对元素差异时才生效
实现步骤与代码
我会写一段注释详细的代码,每一步都给你解释清楚:
<?php // 定义你的两个数组 $arr1 = [1, 1, 7, 2]; $arr2 = [1, 13, 2, 1]; // 第一步:先验证数组长度是否相同 // 因为我们是给元素加数字,不是新增元素,长度不同肯定没法匹配 if (count($arr1) !== count($arr2)) { echo "错误:数组长度不同,无法通过添加单个正整数使两数组相等"; exit; } // 第二步:排序数组,让相同元素对齐,方便快速定位差异 $sortedArr1 = $arr1; $sortedArr2 = $arr2; sort($sortedArr1); sort($sortedArr2); $diffElements = []; $diffIndex = -1; // 第三步:遍历排序后的数组,找到第一对不同的元素 foreach ($sortedArr1 as $index => $value) { if ($value !== $sortedArr2[$index]) { $diffElements = [$value, $sortedArr2[$index]]; $diffIndex = $index; break; } } // 处理数组已经相等的情况 if (empty($diffElements)) { echo "两数组已经完全相等,无需添加数字"; exit; } // 第四步:验证是否只有一对差异元素(符合你的前提条件) // 检查剩下的所有元素是否都相同 for ($i = $diffIndex + 1; $i < count($sortedArr1); $i++) { if ($sortedArr1[$i] !== $sortedArr2[$i]) { echo "错误:差异元素数量超过1,不符合场景要求"; exit; } } // 第五步:计算最小正整数,确定要添加的数组 $numFromArr1 = $diffElements[0]; $numFromArr2 = $diffElements[1]; $difference = $numFromArr2 - $numFromArr1; if ($difference > 0) { // 差值为正,说明arr1的元素更小,加这个数到arr1 echo "{$difference} 1"; } else { // 差值为负,取绝对值,加到arr2的对应元素上 $minPositiveNum = abs($difference); echo "{$minPositiveNum} 2"; } ?>
关键细节说明
为什么要排序?
直接用array_diff可能会有坑!比如如果数组是arr1=[1,1,2]和arr2=[1,2,2],array_diff($arr1, $arr2)会返回[1],看起来符合sizeof==1的条件,但实际上有两对元素数量不同,没法通过加一个数让数组相等。排序后对齐元素,能准确判断是否只有单个元素值不同,其他元素完全一致。前提条件的严谨性
你提到的sizeof(array_diff($arr1, $arr2)) == 1只能作为初步判断,结合排序后检查剩余元素是否全相同,才能确保符合你的场景要求。最小正整数的逻辑
计算两个差异元素的差值,如果是正数,直接加到arr1即可;如果是负数,取绝对值加到arr2,这样得到的就是最小的正整数(因为只有一对差异,差值的绝对值就是唯一的正整数选择)。
运行这段代码,针对你的例子会输出6 1,完全符合期望!
内容的提问来源于stack exchange,提问作者Gousia
相关产品推荐
相关产品推荐

