Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 166 Solved: 43
[Submit][Status][Web Board]
给出一个含有 n(0 < n <= 1000) 个整数的数组,请找出其中出现次数超过一半的数。
数组中的数大于等于 -50 且小于等于 50。
Input第一行包含一个整数 n,表示数组大小;
第二行包含 n 个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。
Output题目保证存在这样的数,输出这个数
Sample Input3 1 2 2
Sample Output2
HINT SourceC语言练习题
懒得废话,上ac代码。
#includeint main() { int n,i,half; int a[1001]={0}; int z[51]={0},f[51]={0}; //正数与负数分开存储。 while(~scanf("%d",&n)) { if(n%2==0) half=n/2; if(n%2!=0) half=(n+1)/2; for(i=0;i =0) //如果是正数,则在正数存储数组中进行数量标记。 z[a[i]]++; if(a[i]<0) //如果是负数,则在负数存储数组中进行数量标记。 f[-a[i]]++;//数组下标都是正数所以需要把负数转换为正数。 } for(i=0;i<=50;i++) { if(z[i]>=half) printf("%dn",i); else if(f[i]>=half) printf("-%dn",i); //由于数组下标都是0以上的整数,所以输出时需要添加负号。 } } return 0; }


![[ZCMU OJ]5213: 出现次数超过一半的数(哈希) [ZCMU OJ]5213: 出现次数超过一半的数(哈希)](http://www.mshxw.com/aiimages/31/691330.png)
