【发布时间】:2017-01-27 17:52:29
【问题描述】:
我正在尝试从在线编码网站解决以下问题。
问题: Fredo 非常擅长处理大量数字。因此,一旦他的朋友宙斯给了他一个包含 N 个数字的数组,然后是他必须回答的 Q 个问题。在每个查询中,他定义了查询的类型和 Fredo 必须回答的数字 f。每个查询有以下两种类型: 类型 0:对于这个查询,Fredo 必须回答数组中的第一个数字(从索引 0 开始),使其频率至少等于 f。 类型 1:对于这个查询,Fredo 必须回答数组中的第一个数字,使得频率正好等于 f。 现在,弗雷多回答了他所有的疑问,但现在宙斯想象他应该如何验证它们。因此,他要求您为此编写代码。 注意:如果没有数字是查询的答案,则输出 0。 使用快速 I/O。
输入: 输入的第一行包含 N ,数组的大小 下一行包含 N 个空格分隔的整数。 下一行包含 Q,表示查询的数量。 然后跟随 Q 行,每行有两个整数 type 和 f,表示查询的类型和您必须回答查询的频率。
输出: 您必须在单独的行中打印每个查询的答案。
输入约束:
1≤N≤106
1≤A[i]≤1018
1≤Q≤106
0≤类型≤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
此代码运行正常,并为较小的测试用例提供正确的输出,但在较大的测试用例上超过了时间限制。有人可以建议可以对此代码进行哪些改进以提高速度。
【问题讨论】:
-
这个属于codereview.stackexchange.com
-
尝试使用this method自己弄清楚。
-
我知道我们可以使用 strace 找到每一行的运行时间,但我不确定如何使用它。如果你能详细说明一下,我会很高兴
标签: python performance for-loop runtime