在这个问题中,我们得到了二维查询,例如:
queries = [[1, 1], [2, 2], [3, 2], [1, 2], [1, 1], [1, 1], [2, 1], [3, 2]]
每个查询的格式为
1 x->插入x
2 y->消除y的出现
3 z->检查是否存在频率为z的整数。如果是,则打印1否则0
例如,
Operation Array Output
(1,1) [1]
(2,2) [1]
(3,2) 0
(1,1) [1,1]
(1,1) [1,1,1]
(2,1) [1,1]
(3,2) 1
上面的示例返回一个数组,其输出为:[0,1]
我的解决方案:
def freqQuery(queries):
res = Counter()
output = []
for op, value in queries:
if op == 1:
res[value] += 1
elif op == 2:
if value in res.keys():
res[value] -= 1
elif op == 3:
if value in res.values():
output.append(1)
else:
output.append(0)
return output
链接到问题:https://www.hackerrank.com/challenges/frequency-queries/problem
它在4/15测试用例中失败,有3个错误答案和1个超过时间限制的答案。有人可以告诉我代码有什么问题吗?
更新:
谢谢您的帮助!我的第二个查询是错误的。
新解决方案:
def freqQuery(queries):
res = Counter()
output = []
for op, value in queries:
if op == 1:
res[value] += 1
elif op == 2:
if res[value] > 0:
res[value] -= 1
elif op == 3:
if value in res.values():
output.append(1)
else:
output.append(0)
return output
尽管我仍然无法通过一个测试用例,即超过了时间限制。我该怎么做才能提高代码效率?
答案 0 :(得分:0)
错误答案很明显。您不理解查询3。在查询3中,询问您是否有任何键在字典中的计数恰好是z
。
elif op == 2:
if value in res.keys():
res[value] -= 1
您的代码建议您在不知道实际状态的情况下盲目减少计数器。
您没有从Counter
中删除任何键。
考虑一个简单的情况,要求您添加2
your_code_state: ({2:1})
,然后两次删除两次your_code_state: {2:-1}
,然后再次添加2 your_code_state: {2:0}
,检查是否有{{ 1}}存在,对于您的代码而言,没有z = 1
(因为即使计数器为负,您也会不断递减),但是答案应该是1 your_code_state: {2:0}
。
因此,只需检查计数器是否为负数,如果是,则不递减,保持为0。
为了节省时间,请勿重复进行{2:1}
检查,您可以保留一个单独的字典/哈希表,该字典/哈希表将存储每个计数的频率,例如,如果存在频率in
,第二个字典将包含z
,否则为0。这会将查询函数中的所有操作都降为O(1)。
dict2[z] = 1