📌  相关文章
📜  查找最频繁的数字而不使用数组字符串(1)

📅  最后修改于: 2023-12-03 15:10:45.687000             🧑  作者: Mango

查找最频繁的数字而不使用数组字符串

有时候我们需要在一组数字中查找出现次数最多的数字,但我们不能使用数组或字符串来实现。本篇介绍几种方法来实现这个功能。

方法一:使用位运算

我们可以使用二进制数中的每一位来代表一个数字出现的次数,比如说第0位代表数字0出现的次数,第1位代表数字1出现的次数,以此类推。我们遍历整个数字序列,对于每一个数字,我们将对应位的数加一。最后我们只需要找到最高位为1的数,它的位置就是出现次数最多的数字。

def find_most_frequent_number(numbers: List[int]) -> int:
    max_frequency = 0
    max_frequency_num = -1

    for i in range(32):
        frequency = 0
        for num in numbers:
            if (num >> i) & 1:
                frequency += 1
        if frequency > max_frequency:
            max_frequency = frequency
            max_frequency_num = i

    return max_frequency_num
方法二:使用哈希表

我们可以使用哈希表来记录每个数字出现的次数。遍历整个数字序列,对于每一个数字,我们检查它是否已经在哈希表中。如果不在,我们就将它加入哈希表,并将出现次数设为1;如果在,我们将对应的出现次数加1。最后我们只需要在哈希表中查找出现次数最大的数字即可。

def find_most_frequent_number(numbers: List[int]) -> int:
    freq = {}
    max_freq = 0
    max_freq_num = -1

    for num in numbers:
        if num not in freq:
            freq[num] = 1
        else:
            freq[num] += 1

        if freq[num] > max_freq:
            max_freq = freq[num]
            max_freq_num = num

    return max_freq_num
方法三:使用链表

我们可以使用链表来记录每个数字出现的次数。遍历整个数字序列,对于每一个数字,我们检查它是否已经在链表中。如果不在,我们就将它加入链表,并将出现次数设为1;如果在,我们将对应的出现次数加1。最后我们只需要在链表中查找出现次数最大的数字即可。

class Node:
    def __init__(self, num: int):
        self.num = num
        self.freq = 1
        self.next = None


def find_most_frequent_number(numbers: List[int]) -> int:
    head = None
    max_freq = 0
    max_freq_num = -1

    for num in numbers:
        found = False
        n = head

        while n:
            if n.num == num:
                n.freq += 1
                if n.freq > max_freq:
                    max_freq = n.freq
                    max_freq_num = n.num
                found = True
                break
            n = n.next

        if not found:
            new_node = Node(num)
            if not head:
                head = new_node
            else:
                new_node.next = head
                head = new_node

    return max_freq_num

以上是几种不使用数组或字符串来查找最频繁数字的方法。