如何修改合并排序算法的数组位置?[已编辑]

2024-04-18 01:34:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在这里为合并排序编写合并函数。你知道吗

当我尝试递归地编写函数时,我无法找到全局修改变量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!")

Tags: 函数testselfreturnif排序notassert
1条回答
网友
1楼 · 发布于 2024-04-18 01:34:49

如果在表达式中使用列表的子范围(这里特别是作为函数调用的参数),而不是作为赋值的左侧,则会创建一个新的独立列表:

>>> nums = [1,2,3]
>>> numsSub = nums[1:]
>>> numsSub[0] = 7
>>> nums
[1, 2, 3]
>>> numsSub
[7, 3]

可能的解决方案:

  1. 将调用前的子列表赋给一个单独的变量,在调用中用作参数,并在调用后将其复制回nums1
  2. merge添加一个参数,它告诉nums1的第一个项目应该被处理,并始终将完整的nums1作为参数,如下所示:

def merge(self, nums1, m, nums2, n, base=0): ... self.merge(nums1, m - 1, nums2, n, base + 1)

相关问题 更多 >

    热门问题