LeetCode数组合并题concat拼接后无法得到完整数组问题排查
LeetCode合并有序数组JS代码运行不一致问题
问题现象
刷LeetCode合并两个有序数组题目时遇到异常:同一段JavaScript实现代码,在JS Fiddle、Programiz等第三方在线编译器运行时,可得到完整的数组合并结果;但在LeetCode编译环境中提交运行时,仅返回第一个数组的内容,无法得到完整拼接后的正确结果。
佐证材料
- LeetCode提交运行截图:执行后仅返回部分数组,未生成完整合并结果
- 第三方在线编译器运行截图:执行后可正常输出完整合并后的数组
问题复现代码
var merge = function(nums1, m, nums2, n) { let x = nums1.length; if(x !== m){ for(let i = x; i > m; i--){ nums1.pop(nums1[i]); } } return nums1.concat(nums2).sort((a,b)=> a -b); }; // 自行测试时打印返回值可得到[1,2,2,3,5,6]的正确结果 console.log(merge([1,2,3,0,0,0],3,[2,5,6],3));
根因分析
问题和编译器环境差异无关,本质是对题目判题规则、JavaScript数组API特性不熟悉导致:
- 题目判题规则要求原地修改:这道题不需要函数返回合并后的新数组,LeetCode判题逻辑会在函数执行结束后,直接读取最初传入的
nums1引用指向的数组内容做结果校验,完全不会读取函数return的值。 concatAPI不会修改原数组:Array.concat()是不会产生副作用的纯方法,调用后不会改动原数组,只会生成并返回一个全新的拼接后的数组。你在第三方平台测试时,手动打印的是函数返回的这个新数组,所以看起来结果正确;但原始传入的nums1经过前面的pop操作后,仅保留了前m个元素,根本没有写入nums2的内容,LeetCode校验原数组时自然只能拿到第一个数组的内容。- 额外提示:
Array.pop()方法本身不需要传入参数,你代码中pop内传入的nums1[i]是无效参数,虽然不影响当前逻辑,但属于冗余写法。
内容的提问来源于stack exchange,提问作者Lazy Gyan
相关产品推荐
相关产品推荐

