【问题标题】:Delete elements with highest frequency删除频率最高的元素
【发布时间】:2021-07-10 06:18:54
【问题描述】:

我正在寻找一个挑战,但无法解决:

我们得到一个有一个开口端的管子,并且有 q 个查询。每个查询包含 2 个整数:X 和 N。

如果 X=1,将 N 插入管的开口端。

如果 X=2,取出一个出现次数最多的整数(即在管中具有最大频率),并删除它最靠近管开口端的出现。如果多个数字的频率相同且最大,我们应该删除最靠近管子开口端的数字。 N 在此查询中被忽略。

返回在 X=2 查询期间删除的元素列表。

示例输入

q=6
1,2
1,4
1,3
1,2
2,-1
2,-1

预期输出

[2,3]

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    您可以使用stacks 中的dynamic array,与hash table 结合使用。

    数组每个频率都有一个条目,因此第一次出现的所有 N 值将存储在第一个数组条目中,第二次出现的 N 值将存储在第二个数组条目中,.. 。ETC。在每个数组条目中,收集到的 N 个值将按查询顺序存储 - 即作为堆栈。当一个 N 值重复出现时,它们之前的位置不会受到影响……另一个 N 值只会被添加到另一个堆栈中。

    哈希表将用于跟踪 N 值的当前出现次数。它的键/值对是(N,频率)对。这样我们就知道在哪个子栈中找到/添加某个 N。

    伪代码中的算法:

    function solve(queries)
        array ← an empty dynamic array of stacks of N-values
        freq ← an empty hashmap of (N, frequency) key/value pairs
        result ← an empty dynamic array of N-values
    
        for i ← 1 to length(queries) do
            x ← queries[i][1]
            n ← queries[i][2]
            if x equals 1 then
                if not freq has n then
                    freq[n] ← 0
                end if
                increment freq[n]
                if freq[n] > size of array then
                    append an emtpy stack to array
                end if
                push n on the stack at array[freq[n]]
            else
                stack ← last stack on array
                pop n from stack
                if stack is empty then
                    pop this stack from array
                end if
                append n to result
            end if
        end for
        return result
    end function
    

    在 Python 中的实现:

    def solve(queries):
        buckets = [[-1]]  # entry at index 0 is not used. It is just a filler
        freq = defaultdict(int)
    
        for i, (x, n) in enumerate(queries):
            if x == 1:
                freq[n] += 1
                if freq[n] >= len(buckets):
                    buckets.append([])
                buckets[freq[n]].append(n)
            else:
                n = buckets[-1].pop()
                if len(buckets[-1]) == 0:
                    buckets.pop()
                yield n
    
    # Demo run
    queries = [(1, 2),(1, 4),(1, 3),(1, 2),(2, -1),(2, -1)]
    print(*solve(queries))
    

    【讨论】:

    • 嗨,你是怎么解决问题的,能告诉我吗?
    • 通过大量练习。只有通过经验,你才能建立一定的直觉。
    • 我们可以在社交媒体上联系吗,因为我遇到了很多问题。我认为你是专业人士,我可以从你那里得到帮助。
    • 我不做社交媒体。只需在 Stack Overflow 上提出有针对性的问题,如果它们结构合理,并展示你的工作,你就会得到答案。
    • stackoverflow.com/q/68014092/15163166你能给我这个解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2012-11-03
    • 2021-12-11
    • 1970-01-01
    • 2019-08-15
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多