数组中重复次数最多的数

数组中重复次数最多的数


该题前提是该数组是已经排列好的数组

第一种思路:

  • 从头遍历数组,两个变量保存出现最频繁的数字和出现的次数
  • 每次都找到一个数字出现的最大次数,然后和之前保存的结果相比较,若该数字出现次数较大,那么就替换之前的保存结果,反之继续

第二种思路:

  • 用map映射表,这里map会将变量初始化为0。第一个关键字保存数字,第二个关键字保存该数字出现的次数。

下面是两种思路的代码:

// FindMostFrequentInArray.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include <iostream>
#include <map>
 
using namespace std;
 
bool FindMostFrequentInArray(int array[],int len,int &mostNum, int &frequentCount)
{
    if (array == NULL || len<=0)
        return false;
 
    frequentCount = 1;
    mostNum = array[0];//初始值为数组中第一个数字
 
    map<int,int> m;
    for (int i=1;i<len;i++)
    {
        m[array[i]]++;
        if (m[array[i]] > m[array[mostNum]])
        {
            mostNum = array[i];//修改出现次数最多的数字 
            frequentCount = m[mostNum];//出现次数
        }
    }
    return true;
}
 
bool FindMostFrequentNum(int array[],int len,int &mostNum, int &frequentCount)
{
    //遍历数组,保存出现最多的数字以及次数
    if (array == NULL || len<=0)
        return false;
 
    mostNum = array[0];//最频繁的数字初始化为数组中第一个数字
    frequentCount = 1;//出现次数初始化为1次
 
    int tMostNum;
    int tFrequentCount;//临时变量
    for (int i=1;i<len;i++)
    {
        tMostNum = array[i];
        tFrequentCount = 1;
         
        while (i<len-1 && tMostNum == array[i+1])
        {
            i++;
            tFrequentCount ++;
        }
 
        if (tFrequentCount > frequentCount)
        {
            //替换之前保存的最频繁的数字和次数
            frequentCount = tFrequentCount;
            mostNum = tMostNum;
        }
    }
 
    return true;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int array[] = {1,2,3,4,4,4,5,5,5,5,6,7,8,8,9,9,9,9,9,9,9,9,9};
    int len = sizeof(array)/sizeof(array[0]);
    int mostNum = 0;
    int frequentCount = 0;
 
    if (FindMostFrequentInArray(array,len,mostNum,frequentCount) == true)
    {
        cout<<"出现最多的数字为:"<<mostNum<<" 出现次数为:"<<frequentCount<<endl;
    }
    else
        cout<<"参数存在错误"<<endl;
 
 
    if (FindMostFrequentNum(array,len,mostNum,frequentCount) == true)
    {
        cout<<"出现最多的数字为:"<<mostNum<<" 出现次数为:"<<frequentCount<<endl;
    }
    else
        cout<<"参数存在错误"<<endl;
    return 0;
}
在 Python 中,可以通过种方法数组重复次数最多的元素。以下是几种常见且高效的实现方式: ### 方法一:使用 `collections.Counter` `Counter` 是 Python 标准库中的一个类,专门用于统计可迭代对象中各元素的频率。它提供了便捷的方法来查出现次数最多的元素[^2]。 ```python from collections import Counter array = [0, 1, 2, 2, 3, 4, 4, 4, 5, 6, 'aswd'] # 创建 Counter 对象并统计频次 counter_obj = Counter(array) # 获取出现次数最多的元素及其频次 most_common_element = counter_obj.most_common(1)[0][0] print(f"重复次数最多的元素是: {most_common_element}") ``` --- ### 方法二:手动构建字典统计 如果不希望依赖外部模块,可以自己创建一个字典来存储每个元素的出现次数,并从中筛选出最大值[^3]。 ```python def find_most_frequent(arr): frequency_dict = {} # 统计每个元素的出现次数 for item in arr: if item in frequency_dict: frequency_dict[item] += 1 else: frequency_dict[item] = 1 # 寻具有最高频率的元素 max_frequency = max(frequency_dict.values()) most_frequent_elements = [key for key, value in frequency_dict.items() if value == max_frequency] return most_frequent_elements array = [1, 4, 4, 5, 5, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6] result = find_most_frequent(array) print(f"重复次数最多的元素是: {result}") # 输出可能是一个列表,如果有个元素拥有相同的最高频率 ``` --- ### 方法三:基于集合去重与列表推导式 另一种思路是对原始数组先进行唯一化处理(即转换为 set),再逐一计算这些唯一值在原数组中的量,最后选出最大的那几个[^5]。 ```python def get_max_occurrence(arr): unique_items = set(arr) # 去除重复项得到唯一的元素集合 counts = [(item, arr.count(item)) for item in unique_items] # 计算每种元素的量 max_count = max(counts, key=lambda x: x[1])[1] # 到最大量 result = [item for item, count in counts if count == max_count] # 收集达到这个量的所有项目 return result test_array = [1, 4, 4, 5, 5, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6] output = get_max_occurrence(test_array) print(output) # 结果可能是 [4, 5], 因为两者都出现了四次 ``` 注意,在某些情况下可能会有不止一个元素共享最高的出现次数;因此返回的结果通常应该设计成能容纳这种情况的形式——比如上面例子中的列表。 --- ### 性能考量 当面对非常庞大的据集时,应当优先考虑那些时间复杂度较低的技术方案。例如,虽然直接调用 `list.count()` 很直观易懂,但它每次都会重新扫描整个序列从而带来较高的开销(O(n²))。相比之下,借助哈希表原理工作的 `Counter` 或者纯手写的词频映射则只需单趟遍历就能完成任务(O(n))[^4]。 综上所述,无论是追求简洁还是灵活性,Python 都提供了解决此类问题的有效途径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值