数组中重复次数最多的数
该题前提是该数组是已经排列好的数组
第一种思路:
- 从头遍历数组,两个变量保存出现最频繁的数字和出现的次数
- 每次都找到一个数字出现的最大次数,然后和之前保存的结果相比较,若该数字出现次数较大,那么就替换之前的保存结果,反之继续
第二种思路:
- 用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;
}