我尝试执行的程序具有以下问题说明:
程序必须接受N个包含1到N的整数的整数 以任何顺序重复。该程序必须打印丢失的 给定整数中从1到N的整数,升序为 输出。
示例:
输入: 5
2 5 5 1 1
输出:3 4
说明:5个整数2 5 5中缺少整数3和4 1 1.因此,输出3和4作为输出
我的代码:
def modusoperandi(n, t):
if str(n) not in t:
yield n
n = int(input())
t = tuple(sr for sr in input().split())
for i in range(1,n+1):
for j in modusoperandi(i,t):
print(j,end=' ')
但是,我的代码未能通过所有测试用例,因为对于具有大量输入的测试用例,执行它花费了大量的时间(耗时超过500毫秒,这是时间限制)。
我尝试使用 timeit 方法计算执行时间。奇怪的是,当给定的N个元组中元素的数量增加时,执行时间也会增加。我认为元组比list更可取,因为它应该更有效。
答案 0 :(得分:5)
您将需要将现有数字转换为int
个egg,然后将其放入set
中;集合对于确定给定值是否为成员非常有效。
n = int(input())
extant = set(int(n) for n in input().split())
for i in range(1, n + 1):
if i not in extant:
print(i, end=" ")
答案 1 :(得分:1)
关键确实是使用一个集合来检查输入字符串中期望数字的存在。但是,您无需将输入转换为整数。您可以通过将序列号生成为字符串来进行其他操作。
nums = input().split()
numSet = set(nums)
missing = " ".join(str(n) for n in range(1,len(nums)+1) if str(n) not in numSet)
print(missing) # 3 4
对于此特定问题,有一种使用集合的方法要快一些,因为您可以负担得起创建一个已知(且合理)大小的标志数组:
numbers = input().split()
present = [False]*len(numbers)
for n in numbers: present[int(n)-1] = True
missing = " ".join(str(n+1) for n,seen in enumerate(present) if not seen)
答案 2 :(得分:0)
n = '5'
i = '2 5 5 1 1'
def compute(n, i):
s1 = set(range(1, n+1))
yield from sorted(s1.difference(i))
for val in compute(int(n), map(int, i.split()) ):
print(val, end=' ')
打印:
3 4
答案 3 :(得分:0)
您应该考虑解决方案的复杂性(这很糟糕):
def modusoperandi(n, t):
# Since 't' is a tuple, the complexity of 'not in t' is O(len(t))
# This makes the overall complexity of this function O(len(t))
if str(n) not in t:
yield n
n = int(input())
t = tuple(sr for sr in input().split()) # O(len(t))
for i in range(1,n+1): # O(n) iterations
# 0 or 1 iteration, but the call to 'modusoperandi' is O(len(t))
for j in modusoperandi(i,t):
print(j,end=' ')
总体复杂度O(n * len(t))。这不是一个很好的复杂性。您希望输入具有线性的复杂度。有两种方法:
set
就是这样的哈希表。不幸的是,哈希表有一些缺点。n
个条目且数字在1..n范围内,因此使用特征向量values_encountered
的效率非常高,其中values_encountered[i]
为{{ 1}}仅当遇到True
值时。对于这种大输入,此解决方案可能比集合运行得更快,并且消耗的内存更少。。
i