如何使我的Python代码更省时?

时间:2019-07-01 14:18:21

标签: python

我尝试执行的程序具有以下问题说明:

  

程序必须接受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更可取,因为它应该更有效。

4 个答案:

答案 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))。这不是一个很好的复杂性。您希望输入具有线性的复杂度。有两种方法:

  1. 使用哈希表标记所有已访问的整数,set就是这样的哈希表。不幸的是,哈希表有一些缺点。
  2. 由于存在n个条目且数字在1..n范围内,因此使用特征向量values_encountered的效率非常高,其中values_encountered[i]为{{ 1}}仅当遇到True值时。对于这种大输入,此解决方案可能比集合运行得更快,并且消耗的内存更少。

i