题目描述
在n个数中,找出出现次数最多那个数字。数据保证结果唯一。
输入
单组数据,第一行数字n(1<=n<=100000)。
接下来有n个数字,每个数字不超过100000000
接下来有n个数字,每个数字不超过100000000
输出
出现次数最多的数字。
示例输入
3 1 1 2
示例输出
1用快排加上哈希首先把输入的数从小到大拍然后如果和前面相同就记录加1,否则j++;#include<stdio.h> int cmp(int a,int b) { return a>b; } int main() { int m,i,j,t,e,max=-1,a[100010],b[100010]={0}; scanf("%d",&m); for(i=1; i<=m; i++) { scanf("%d",&a[i]); } qsort(a,m,sizeof(a[0]),cmp); j=0; for(i=2;i<=m;i++) if(a[i]==a[i-1]) { b[j]++; if(b[j]>max) {max=b[j];e=i;} } else j++; printf("%d",a[max]); return 0; }
刚开始用的哈希结果数组太大后来用排序结果超时,下面是错误代码
#include <stdio.h> #include <stdlib.h> int a[100000],b[100000000]={0}; int main() { int m,n,i,e,max; scanf("%d",&m); n=-1;max=-1; for(i=0; i<m; i++) { scanf("%d",&a[i]); b[a[i]]++; if(a[i]>n) n=a[i]; } for(i=0;i<=a[i];i++) if(b[i]>max) {max=b[i];e=i;} printf("%d",e); return 0; }
题目描述
在n个数中,找出出现次数最多那个数字,并且输出出现的次数。如果有多个结果,输出数字最小的那一个。输入
单组数据,第一行数字n(1<=n<=100000)。
接下来有n个数字,每个数字不超过100000000输出
出现次数最多的数字和次数。示例输入
3 1 1 2示例输出
1 2赋值时要注意b1000010]={0}或者b[1000010]={-1}时是全部赋值,否则就是给第一个数值赋值,我这里没用到f[0]所以无所谓#include<stdio.h> int a[100010],b[100010]={1}; int cmp(int a,int b) { return a>b; } int main() { int m,i,j,t,e,k,max; scanf("%d",&m); for(i=1; i<=m; i++) { scanf("%d",&a[i]); } max=-1;e=1;k=1; qsort(a,m,sizeof(a[0]),cmp); j=1; for(i=2;i<=m;i++) if(a[i]==a[i-1]) { b[j]++; if(b[j]>max) {e=i;k=j;max=b[j];} } else j++; printf("%d %d\n",a[e],b[k]+1); return 0; }
下面用到的是链地址法看了同学的代码自己又手敲了一遍感觉指针真棒
<pre code_snippet_id="186350" snippet_file_name="blog_20140216_4_6553653" name="code" class="cpp">#include<stdio.h> #include<string.h> struct node { int date; int jishu; struct node *next; } q[100002]; int jianzao(int n,int m) { node *p=&q[n],*t; t=p; while(p!=NULL) { if(p->date==m) { p->jishu++; return 0; } p=p->next; if(t->next!=NULL) t=t->next; } p=t; p->next=new node; p=p->next; p->date=m; p->jishu=1; p->next=NULL; return 0; } int Max; int Find(void) { int t=0,i,n=0; node *p; for(i=0; i<100000; i++) { p=&q[i]; while(p!=NULL) { if(p->jishu>t) { t=p->jishu; n=p->date; } else if(p->jishu==t) { if(p->date<n) { n=p->date; } } p=p->next; } } Max=n; return t; } int main() { int m,n,i; scanf("%d",&n); memset(q,0,sizeof(q)); for(i=0; i<n; i++) { scanf("%d",&m); jianzao(m%100000,m); } int s=Find(); printf("%d %d\n",Max,s); return 0; }