Python中Leetcode题目Output与Stdout不一致问题求助
问题分析:LeetCode合并数组题本地输出正确但系统判定错误
我是编程新手,正在做Leetcode题目,题目要求将答案存储在nums1中。当我打印nums1时,Stdout显示正确答案,但系统判定的Output却不一致?
用户提供的代码:
class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ for x in range(n): nums1.remove(0) nums1 = nums1 + nums2 nums1.sort() print(nums1)
问题根源
- 列表赋值逻辑错误:
nums1 = nums1 + nums2会创建一个全新的列表对象,并把函数内的局部变量nums1指向这个新列表,但外部传入的原始nums1列表根本没被修改。LeetCode系统检查的是传入的原始列表内容,所以判定结果和你打印的不一致。 - 删除0的逻辑漏洞:用
nums1.remove(0)删除占位0的方式不可靠,如果nums1的有效元素本身包含0,会误删有用数据。正确的做法是直接截取前m个有效元素。
修正方案
方案一:简单修改(保证正确性)
class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ # 用切片赋值直接修改原列表内容,而非创建新列表 nums1[:] = nums1[:m] + nums2 nums1.sort()
方案二:双指针最优解法(时间O(m+n),空间O(1))
题目要求原地修改,双指针从后往前遍历可避免覆盖未处理元素,无需额外空间:
class Solution(object): def merge(self, nums1, m, nums2, n): # 三个指针分别指向nums1有效元素末尾、nums2末尾、nums1整体末尾 p1, p2, p = m - 1, n - 1, m + n - 1 # 从后往前填充较大的元素 while p1 >= 0 and p2 >= 0: if nums1[p1] > nums2[p2]: nums1[p] = nums1[p1] p1 -= 1 else: nums1[p] = nums2[p2] p2 -= 1 p -= 1 # 若nums2还有剩余元素,直接复制到nums1的前面位置 nums1[:p2+1] = nums2[:p2+1]
关键说明
- 使用
nums1[:] = ...是直接修改原列表的内部元素,而nums1 = ...仅改变局部变量的指向,不会影响外部传入的原始列表。 - 双指针解法无需排序,效率更高,符合LeetCode题目的最优解要求。
内容的提问来源于stack exchange,提问作者volrriti
相关产品推荐
相关产品推荐

