有人可以在我的hackerrank频率查询代码中帮助您解决问题吗?

时间:2020-05-30 02:37:05

标签: python python-3.x

在这个问题中,我们得到了二维查询,例如:

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

尽管我仍然无法通过一个测试用例,即超过了时间限制。我该怎么做才能提高代码效率?

1 个答案:

答案 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