寻找发帖水王
问题是这样的,有个人发帖很多,占总帖数一半以上。让你找出他。
初看到这个问题大家想的都是把帖子按ID排序,中间位置的ID一定是要找的,但对于数量庞大的数据来说排序并不是最优秀的,所以我们要想一个不用排序的算法。
那么这个方法就千呼万唤始出来了,我叫它开心消消乐,比如有这样一组数字 1,1,2,3,4,4,4,2,4,4,1,1,4,4,
我们从左到右进行遍历,首先假设第一个数是我们要找的,我们要记录它两方面信息,一个是值,一个是个数,可以用一个Map来实现,按以下顺序遍历,map有以下变化
1.对于1,目前的<key,value>就是<1,1>,
1.接下来继续遍历一个1变为<1,2>,也就是进来的key与原有的key相等,那么value值加1
再后来的数字是2,与1不相等,那么我们维持的Map变为<1,1>,也就是当前key值与我们进来的key不等,value值减1,
3进来后Map变为<1,0>,当value变为0后,下一个进来的值将更新key值,
4进来变为<4,1>
接下来几个连续的4进来变为.<4,3>
2进来,<4,2>
······最后整个数组遍历完<4,4>,所以4就是我们要找的。
写到这里我发现其实不用map也行,用个数组就好了,只需两个长度的数组。具体如下:
public class Number_more_than_Ahalf {
public static void main(String[] args) {
int []a= {1,1,2,3,4,4,4,2,4,4,1,1,4,4};
int[] b=new int[2];
b[0]=a[0];
b[1]=1;
for(int i=1;i<a.length;i++) {
//下一个数与当前数相同
if(a[i]==b[0])
b[1]++;
//下一个数与当前数不同且b[1]>0
else if(a[i]!=b[0]&&b[1]>0)
b[1]--;
//下一个数与当前数不同且b[1]=0,重置数组
else if(a[i]!=b[0]&&b[1]==0) {
b[0]=a[i];
b[1]=1;
}
}
//如果不加后面这部分判定,就会发现这样的数组序列1,2,3,2,4,2,5,2,3会输出错误结果3,所以针对结果还是要再判定一下的
int count=0;
for(int i=0;i<a.length;i++) {
if(a[i]==b[0])
count++;
}
if(count>a.length/2)
System.out.println(b[0]);
else System.out.println(0);
}
}