LeetCode质询||Python皮||第645章一个人|我遇到了一个令人困惑的错误

4dbbbstv  于 2022-10-30  发布在  Python
关注(0)|答案(2)|浏览(114)

所以,我试图解决这个问题在leetcode:
你有一个整数集s,它最初包含从1到n的所有数字。不幸的是,由于一些错误,s中的一个数字与集合中的另一个数字重复,这导致一个数字重复,另一个数字丢失。
系统将为您提供一个整数数组nums,表示此集合在出错后的数据状态。
求出出现两次的数字和缺少的数字,并以数组形式返回它们。
例一:

Input: nums = [1,2,2,4]
Output: [2,3]

例二:

Input: nums = [1,1]
Output: [1,2]

限制条件:

2 <= nums.length <= 10e4
1 <= nums[i] <= 10e4

你会发现我写的代码在下面。所以,我遇到的问题是关于大列表超出时间。实际上,mysolution工作得很好(在33/49的情况下),我如何优化我的代码或得到更好的结果。

class Solution(object):
  def findErrorNums(self, nums):

    nums.sort()
    rep_miss = [] 
    for i  in range(len(nums)) :
        for j in range(i+1, len(nums)) :

            if   nums[i] == nums[j] :
                rep_miss.append(nums[i])

    for i  in range(1, len(nums)+1) :
        if i not in nums : #and abs(rep_miss[0]-i ==1) :
            rep_miss.append(i)

    return rep_miss

祝你愉快!

mfuanj7w

mfuanj7w1#

在Python中,总是值得寻找不涉及大循环和索引的方法,例如使用计数器、字典和集合。

from collections import Counter

mylist = sorted([1, 2, 2, 4])
myset = {x for x in range(mylist[0], mylist[-1] + 1)}

counts = Counter(mylist)  # a dictionary of counts in mylist
dup = [x for (x, y) in counts.items() if y == 2]
miss = list(myset - set(mylist))

print(dup + miss)

其输出[2,3]

avwztpqn

avwztpqn2#

或者,您也可以尝试这样做,一旦您得到了 * 完整 * 的列表,那么答案只是做一个简单的 * 数学:*

def findErrorNums(self, nums: List[int]) -> List[int]:

    completed = sum(range(1, len(nums)+1))

    return [sum(nums) - sum(set(nums)),         # duplicate
            completed  -   sum(set(nums))]      # missing

相关问题