用Python合并两个排序的数组后出现意外输出

时间:2019-01-29 08:03:31

标签: python arrays loops

我找到了解决该问题的部分方法;但是,似乎我从数组中获得了多余的数字。这是我要找出的问题:

  

给出两个已排序的整数数组nums1和nums2,将nums2合并为   nums1作为一个排序数组。

     

注意:

     

在nums1和nums2中初始化的元素数是m和n   分别。您可以假设nums1有足够的空间(大小为   大于或等于m + n)以容纳nums2中的其他元素。   示例:

     

输入:nums1 = [1,2,3,0,0,0],m = 3 nums2 = [2,5,6],n = 3

     

输出:[1,2,2,3,5,6]

我正在练习一些关于Python3语言的编码挑战,并准备接受采访。我尝试了一些方法,例如在数组的开头为0时使用pop。但是似乎在出现新的测试用例之后,我应该期望更多。我的语言很新。

def mergeArrays(nums1, m, nums2, n):
    nums1[:] = sorted(nums1 + nums2)
    i = 0
    while (i < len(nums1[:-1])):
        if nums1[i] is 0:
            nums1.pop(i)
        if i > len(nums1):
            break
        i += 1
    print(nums1)

nums1 = [-49,-48,-48,-47,-45,-42,-39,-36,-33,-33,-28,-28,-23,-23,-7,-4,-3,0,0,4,6,21,29,29,31,34,36,38,40,43,45,46,47,0,0,0,0,0,0,0,0]
m = len(nums1)

nums2 = [-16,-5,-3,26,33,35,38,41]
n = len(nums2)
mergeArrays(nums1, m, nums2, n);

我的预期输出应该是两个数组都经过排序并通过。结果应为:[-49,-48,-48,-47,-45,-42,-39,-36,-33,-33,-28,-28,-23,-23,-16,-7,-5,-4,-3,-3,0,0,4,6,21,26,29,29,31,33,34,35,36,38,38,40,41,43,45,46,47]

但是,我得到了两个额外的零,看起来应该像这样: [-49,-48,-48,-47,-45,-42,-39,-36,-33,-33,-28,-28,-23,-23,-16,-7,-5,-4,-3,-3,0,0,0,0,0,4,6,21,26,29,29,31,33,34,35,36,38,38,40,41,43,45,46,47]

编辑:添加了更多信息以使问题清楚。

3 个答案:

答案 0 :(得分:0)

根据我的理解,您希望对两个排序后的数组进行排序而没有任何重复的元素。您可以参考以下代码:

first_list = [-49,-48,-48,-47,-45,-42,-39,-36,-33,-33,-28,-28,-23,-23,-7,-4,-3,0,0,4,6,21,29,29,31,34,36,38,40,43,45,46,47,0,0,0,0,0,0,0,0]
second_list = [-16,-5,-3,26,33,35,38,41]
merged_list = list(set(first_list+second_list))
merged_list.sort()
print(merged_list)

答案 1 :(得分:0)

我使用的一种旧方法是循环理解。基本上,我所做的就是从头到尾进行数组拼接,并在循环内部进行排序:

def mergeArrays(nums1, m, nums2, n):
    nums1[0: m + n] = [x for x in sorted(nums1[:m] + nums2[:n])]

如果您的解释与我刚才的解释不同,请放心:)

答案 2 :(得分:0)

反复研究代码的意图以及不需要的神秘零值的来源之后,您似乎想执行以下操作:对两个数组进行合并排序,保留重复项:

  • 您的输入是nums1, nums2数组,它们填充了零,并且可以分别长于长度m,n。

    • 但是为了避免选择那些填充的零,您应该仅引用条目0..(m-1),即nums1[:m],同样引用nums2[:n]
    • 您的错误是一直引用到nums1[:-1]
  • 您的解决方案是:sorted(nums1[:m] + nums2[:n]) 。这是一种单列列表理解,您不需要功能。

    • 没有任何理由零条目需要特殊对待。不需要您的while循环。
  • 顺便说一句,即使您想(说)排除所有零,您仍然可以使用单行列表理解:x for x in sorted(nums1[:m] + nums2[:n]) if x != 0]
  • 列表理解是一个整洁的习惯用法,功能强大!请阅读有关它们的更多信息。通常,您在Python中不需要while循环;列表推导,迭代器或生成器通常更简洁,代码更短且效率更高。