编程之美--2.3 寻找发帖的水王

解答


1 方法1:对ID排序后,搜索出现次数最多的。

2 方法2:对ID排序后,返回第N/2项。

public static int Find1(int[] list){
		Arrays.sort(list);
		return list[list.length/2];
	}

3 方法3:很不错的方法。每次删除不同的两个ID,最后剩下的ID肯定是超过一半的。动态规划+记录的方法。

public static int Find2(int[] list){
		int ans=0;
		int times=0;
		for(int i=0;i<list.length;i++){
			if(times==0){
				ans = list[i];
				times ++;
			}
			else{
				if(ans == list[i]){
					times++;
				}
				else{
					times--;
				}
			}
		}
		return ans;
	}

扩展题:这才是真正考察是否学会这道题目的思路。需要三个变量。情况为:如果和其中一个槽位数据相等,那么这个槽位+1;如果有空槽位,那么把新的数据放入;如果都不相等没空槽位,那么所有槽位都-1;

public static int[] Find3(int[] list){
		int[] ans = new int[3];
		ans[1]=Integer.MIN_VALUE;
		ans[2]=Integer.MIN_VALUE;
		ans[0]=Integer.MIN_VALUE;
		int[] times = new int[3];
		if(list.length<3){
			return ans;
		}
		for(int i=0;i<list.length;i++){
			int cur = list[i];
			if(cur == ans[0]){
				times[0]++;
			}
			else if(cur == ans[1]){
				times[1]++;
			}
			else if(cur == ans[2]){
				times[2]++;
			}
			else if(times[0]==0){
				ans[0]=cur;
				times[0]=1;
			}
			else if(times[1]==0){
				ans[1]=cur;
				times[1]=1;
			}
			else if(times[2]==0){
				ans[2]=cur;
				times[2]=1;
			}
			else {
				times[0]--;
				times[1]--;
				times[2]--;
			}
		}
		return ans;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值