我试图在这里为合并排序编写合并函数。
虽然我试图以递归方式编写函数,但我无法想出一种全局修改变量nums1
的方法。
我无法通过test4,因为修改后的nums1
永远不会全局返回。
class Solution(object):
def merge(self, nums1, m, nums2, n):
if not nums1:
nums1[:] = nums2
return
if not nums2:
return
if nums1[0] < nums2[0]:
self.merge(nums1[1: ], m - 1, nums2, n)
return
if nums1[0] >= nums2[0]:
nums1[0], nums1[1:] = nums2[0], nums1[:]
self.merge(nums1, m + 1, nums2[1:], n - 1)
return
if __name__ == "__main__":
# nums1 = [1, 2, 3]
# nums2 = [-1, 4, 5]
# Solution().merge(nums1, 3, nums2, 3)
# assert nums1 == [-1, 1, 2, 3, 4, 5]
nums1 = []
nums2 = [2, 3, 4]
Solution().merge(nums1, 0, nums2, 3)
print("Outside", nums1)
assert nums1 == [2, 3, 4]
print('Test 1 passed!')
nums1 = [1, 2, 3]
nums2 = []
Solution().merge(nums1, 3, nums2, 0)
assert nums1 == [1, 2, 3]
print('Test 2 passed!')
nums1 = [1, 2, 3]
nums2 = [-1]
Solution().merge(nums1, 3, nums2, 1)
assert nums1 == [-1, 1, 2, 3]
print("Test 3 passed!")
nums1 = [1, 2, 3]
nums2 = [1.5]
Solution().merge(nums1, 3, nums2, 1)
print('outside nums1: ', nums1)
assert nums1 == [1, 1.5, 2, 3]
print("Test 4 passed!")
答案 0 :(得分:0)
如果在表达式中使用列表的子范围(此处特别是作为函数调用的参数)而不是作为赋值的左侧,则创建新的独立列表:
>>> nums = [1,2,3]
>>> numsSub = nums[1:]
>>> numsSub[0] = 7
>>> nums
[1, 2, 3]
>>> numsSub
[7, 3]
可能的解决方案:
nums1
merge
添加一个参数,该参数告诉nums1
应该处理的第一项,并始终提供完整的nums1
作为参数,例如: def merge(self, nums1, m, nums2, n, base=0):
...
self.merge(nums1, m - 1, nums2, n, base + 1)