我正试图从在线编码网站解决以下问题。
问题: 弗雷多很擅长处理大数据。所以,一旦他的朋友宙斯给了他一系列N个数字,然后是他必须回答的Q查询。在每个查询中,他定义了查询的类型以及Fredo必须回答的数字f。每个查询都有以下两种类型: 类型0:对于此查询,Fredo必须回答数组中的第一个数字(从索引0开始),使其频率至少等于f。 类型1:对于此查询,Fredo必须回答数组中的第一个数字,使得频率恰好等于f。 现在,Fredo回答了他所有的疑问,但现在Zeus想象他应该如何验证它们。所以,他要求你写一个相同的代码。 注意:如果没有数字作为查询的答案,则输出0。 使用快速I / O.
输入: 输入的第一行包含N,即数组的大小 下一行包含N个空格分隔的整数。 下一行包含Q,表示查询的数量。 然后按照Q行,每行有两个整数类型和f,表示查询的类型和你必须回答查询的频率。
输出: 您必须在单独的行中打印每个查询的答案。
输入约束:
1≤N≤106
1≤A[I]≤1018
1≤Q≤106
0≤type≤1
1≤f≤1018
示例输入
6
1 2 2 1 2 3
5
0 1
0 2
1 2
1 3
0 3
示例输出
1
1
1
2
2
解决方案: 这是我尝试过的解决方案
from collections import Counter
import sys
tokenizedInput = sys.stdin.read().split()
t = int(tokenizedInput[0])
a = []
for i in range(t):
s = int(tokenizedInput[i+1])
a.append(s)
collection = Counter(a)
key = collection.keys()
value = collection.values()
q = int(tokenizedInput[i+2])
k = i+2
for j in range(q):
query = int(tokenizedInput[k+2*j+1])
f = int(tokenizedInput[k+2*j+2])
for w in range(t):
index = key.index(a[w])
if query == 0:
if value[index] >= f:
print a[w]
break
else:
if value[index] == f:
print a[w]
break
if w == t-1:
print 0
此代码正常运行并为较小的测试用例提供正确的输出,但超过了较大测试用例的时间限制。有人可以建议可以对此代码进行哪些改进以提高速度。
答案 0 :(得分:0)
一些建议:完成int()
的{{1}}转换,而不是在循环中反复调用tokenizedInput
;像int()
这样的字典非常有效,不要通过提取密钥和值来猜测它,按照预期使用它;在循环之前预先计算任何你能做的事情;简化,简化,简化。
我已根据上述建议重新编写代码,加上其他调整,看看它是否对您有意义,并在限定时间内执行:
collection
大多数人都会使用单独的read语句来处理它,以输入各种标量和数组值。你选择在开头的一次阅读中做到这一点,这很好,但你必须注意你的设计,以便最初的选择不会妨碍你。