寻找发帖水王

寻找发帖水王

问题是这样的,有个人发帖很多,占总帖数一半以上。让你找出他。

初看到这个问题大家想的都是把帖子按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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值