我正在研究以下问题: 注意:代码在0.4秒的时间限制内工作,这需要O(N + M)解决方案 你朋友给你一个n个正整数的列表:a0,a1,a2,... an-1,按升序排列。
现在,你的朋友会问你问题,每个表格,"这是一个正整数B. B是列表的一部分吗? (B为非递减顺序)"
您的任务是回答这些问题。输出一个整数,这是你说'#34;是"。
的次数输入格式: 第一行输入将包含整数n。
第二行输入将包含n个正整数,即列表a,按升序排列。
下一行输入将包含整数m,即问题数。
接下来的m行输入将包含非递减顺序的整数B,这是您朋友询问的正整数。
输出格式: 输出应该包含一个整数,这是你说" YES"的次数。
这是我的代码:
n = int(raw_input())
a = [int(x) for x in raw_input().split()]
m = int(raw_input())
b = []
for y in range(0, m):
b.append(int(raw_input()))
answer = 0
i = 0
j = 0
z = 1
while (i < n) and (j < m):
if a[i] == b[j]:
answer = answer + 1
while ((z + j) < m):
if a[i] == b[j + z]:
answer = answer + 1
z = z + 1
elif a[i] != b[j + z]:
i = i + 1
j = j + z + 1
elif a[i] < b[j]:
i = i + 1
elif a[i] > b[j]:
j = j + 1
print answer
正如代码所暗示的那样,我试图使用一种比较数组A和数组B中的项的方法,如果它们不匹配,则将一个项添加到数组的索引中。但是,代码没有输出正确的答案,有时会永远循环询问我无限数量的输入。
我是编程的初学者,我知道这是一个非常基础的算法。我在任何不清楚或技术不足的陈述中道歉。
谢谢。
答案 0 :(得分:1)
我不会在这里使用while循环。这就是它无限时间运行的原因。只需使用for
循环。此外,python语言中还有一些非常好的功能,使您可以比自己迭代整个列表更快地完成此任务。
In [6]: count = 0
In [7]: a = [1, 2, 3, 4, 5, 100]
In [8]: b = [1, 3, 1000, -10, 12]
In [9]: for val in b:
...: if val in a:
...: count += 1
...:
In [10]: print count
2
朱利安伯努有一个更优雅的想法:
a = set([1, 2, 3, 4, 5, 100])
b = set([1, 3, 1000, -10, 12])
print len(a.intersection(b))
答案 1 :(得分:0)
您可以先跟踪每个元素在字典b
中出现的次数:
counts = {x: b.count(x) for x in b}
print sum(counts[x] for x in set(a).intersection(b))
答案 2 :(得分:0)
谢谢大家的帮助。 @Greg @JulienBernu我改进了原始逻辑的代码并解决了问题。解决方案是O(N + M),所有输入都在0.25秒内工作。
n = int(raw_input())
a = [int(x) for x in raw_input().split()]
m = int(raw_input())
b = []
for y in range(0, m):
b.append(int(raw_input()))
answer = 0
i = 0
j = 0
while (i < n) and (j < m):
if a[i] == b[j]:
answer = answer + 1
j = j + 1
elif a[i] < b[j]:
i = i + 1
elif a[i] > b[j]:
j = j + 1
print answer
或者,当b不是非递减顺序时,为了回答所有值,请检查列表b是否使用all(b[i] <= b[i + 1] for i in xrange(m-1))
排序。如果没有排序,请使用我以前用作O(Mlog(N))解决方案的二进制搜索方法。