我一直在尝试用Python完成以下任务:
http://codeforces.com/problemset/problem/4/C
我为它创建了一个简单的脚本,如下所示,但它为第7次测试返回运行时错误。我相信这可能是因为代码花了太长时间,所以我需要帮助来优化它。我查看了map和filter命令并尝试实现它们,但没有成功。
a=int(input())
entered_usernames=[]
n=0
while n<a:
y=input()
entered_usernames.append(y)
n+=1
valid_usernames=[]
for i in entered_usernames:
if i not in valid_usernames:
valid_usernames.append(i)
print('OK')
else:
count=1
while i+str(count) in valid_usernames:
count+=1
valid_usernames.append(i+str(count))
print(i+str(count))
答案 0 :(得分:2)
您可以尝试将valid_usernames
更改为set
而不是list
。
对于列表list_a
,操作x in list_a
需要(平均)线性时间。
对于一组set_a
操作x in set_a
需要(平均)恒定时间。
(来源:https://wiki.python.org/moin/TimeComplexity)
这个简单的改变可以改善运行时间。
这个片段可能会让我觉得非常缓慢:
while i+str(count) in valid_usernames:
count+=1
但是,如果要改进这一点,则需要考虑使用完全不同的数据结构。
答案 1 :(得分:2)
为什么不对计数器使用查找dict
并在O(N)时间内解决此问题?
total = int(input()) # get the first input (total usernames)
database = {} # our 'database' / lookup dict
candidates = [input() for _ in range(total)] # pick usernames from the input
for candidate in candidates: # loop through each candidate
if candidate in database: # already used, print with a counter
print(candidate + str(database[candidate]))
database[candidate] += 1 # increase the counter
else: # the candidate doesn't exist in the 'database'...
print("OK")
database[candidate] = 1 # initialize counter for the next time
答案 2 :(得分:0)
你为什么不试试
valid_usernames.append(i+str(valid_usernames.count(i)))
print(i+str(valid_usernames.count(i))