1. 程式人生 > >NYOJ 眾數問題的三種解法

NYOJ 眾數問題的三種解法

眾數問題,這道題可以完全使用c語言,也可以使用stl,今天我用三種方法來求解這道題,選擇自己感興趣的一種即可

眾數問題

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述

所謂眾數,就是對於給定的含有N個元素的多重集合,每個元素在S中出現次數最多的成為該元素的重數,

多重集合S重的重數最大的元素成為眾數。例如:S={1,2,2,2,3,5},則多重集S的眾數是2,其重數為3。

現在你的任務是:對於給定的由m個自然陣列成的多重集S,計算出S的眾數及其重數。

輸入
第一行為n,表示測試資料組數。(n<30)
每組測試的第一行是一個整數m,表示多重集S中元素的個數為m
接下來的一行中給出m(m<100)個不大於10萬的自然數
(不會出現不同元素出現的次數相同的情況,如:S={11,11,22,22,33,33})。
輸出
每組測試資料輸出一行,包含兩個數,第一個是眾數,第二個是其重數,中間以空格隔開。
樣例輸入
1
6
1 2 2 2 3 5
樣例輸出
2 3
第一種方法,這種方法完全使用c語言,不含任何其他的東西,讀起來應該簡單,思路很簡單

#include<stdio.h>
int main()
{
int n;
int a[100],b[100];
scanf("%d",&n);
while(n--)
{
int m,t,ans,max,j,i;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
{
ans=1;
for(j=i+1;j<m;j++)
{

if(a[i]==a[j])
{
ans++;
}
}
b[i]=ans;
}
max=0;
for(i=0;i<m;i++)
{
if(b[i]>max)
{
max=b[i];
t=a[i];
}
}
printf("%d %d\n",t,max);
}
return 0;
}

第二種,使用vector容器,以及sort排序求解

#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int num,n,m;
cin>>n;
while(n--)
{
 int m;
cin>>m; 
vector <int> s;//定義一個容器
for(int i=0;i<m;i++)
{
cin>>num;
s.push_back(num);//將數字輸入容器
}
sort(s.begin(),s.end());//將輸入的數字排序


int ans=1,t=1,k=s[0];
for(int i=0;i<m;i++)
{
if(s[i]==s[i+1])
{
ans++;
if(ans>t)
{
k=s[i];
t=ans;
}
}
else
{
ans=1;
}

cout<<k<<' '<<t<<endl;
}
return 0;
}

第三種也是使用stl的方法求解,只不過使用的是map容器

#include<iostream>
#include<map>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int m,num;
map<int,int>s;
cin>>m;
int t=0;
int ans=0;
for(int i=0;i<m;i++)
{
cin>>num;
s[num]++;
if(s[num]>ans)
{
t=num;
ans=s[num];
}
}
cout<<t<<' '<<ans<<endl; 
}
return 0; 
}

第二種和第三種都可以把輸入輸出換成scanf,和printf,這樣執行的會更快一些。