发帖水王:一堆数中有一个数字出现的次数多于1/2,问那个数?
比较简单的思路就是两个变量,一个记录当前的数字a,另一个记录当前数字出现的次数size,下一个数字与a相同的时候,size++,不同的时候:size>1,则size--;否则更新a,size=1;
加强版:一堆数中有3个数字出现的次数多于1/4,问是哪三个数?
思维迁移,用3个{a,size}量保存当前更新的数,下一个数字的时候,看这三个里面是否有这个数字存在,若是,则相应的size++;否则,找出sizez最小的那个量,size>1,则size--;否则更新a,size=1;
#include<stdio.h> #include<iostream> #include<queue> using namespace std; struct data{ int a; int size; }s[3]; int main(){ int n,i,temp,j; for(i=0;i<3;i++){ s[i].a=0; s[i].size=0; } scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&temp); bool same=0; int sj,min=99999999; for(j=0;j<3;j++){ if(s[j].a==temp){ same=1; sj=j; break; } if(min>s[j].size){ min=s[j].size; sj=j; } } if(same==1){ s[sj].size++; }else{ if(s[sj].size==0){ s[sj].size=1; s[sj].a=temp; }else{ s[sj].size--; } } } for(i=0;i<=2;i++){ printf("%d ",s[i].a); } getchar(); getchar(); return 0; }