数组和指针:超过一半的数字;水王发帖

本文介绍了一种通过一遍扫描数组来找出超过一半次数的数字的方法,这种方法特别适用于找到所谓的水王,即在一个列表中发帖数量超过总数一半的ID。文章详细解释了算法的实现过程,并提供了一个具体的Java代码示例。

二、超过一半的数字:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字
在这里插入图片描述
可以看出6出现的次数超过了数组长度的一半
数组长度为偶数
当出现次数最多的元素恰好全部排在左半区间时,利用快速排序会很难判断
在这里插入图片描述
当出现次数较多的元素排列在正中间时,可以利用快速排序,可以返回数组5和6的下标
在这里插入图片描述
当出现次数较多的元素全部出现在右半区间时,也很难判断
题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

可以利用一遍扫描数组解决
水王占总数的一半,说明总数必为偶数;
假设隔一个数就是水王,两两不同最后一定会消为0;
水王也可能为最后一个元素,每次扫描的时候,多一个动作和最后一个元素作比较,单独计数,计数恰好等于一半;计数不够一半,那么去掉最后一个元素,水王就是留下的那个candidate
在这里插入图片描述
两两不同,最后消除后为0
在这里插入图片描述

package morethanhalf;
import java.util.Arrays;

public class Solve {
	public static void solve4(int[] arr){  
		int candidate=arr[0];  //候选数
		int nTimes=0;    //出现的次数
		int countOfLast=0;  //统计最后这个元素出现的次数
		int N=arr.length;
		for(int i=0;i<N;i++) {
			if(arr[i]==arr[N-1])  //增加和最后一个元素比较的步骤
			countOfLast++;
			
			if(nTimes==0) {
			candidate=arr[i];
			nTimes=1;
			continue;
			}
			if(arr[i]==candidate)
				nTimes++;
			else
				nTimes--;
		}
		if(countOfLast==N/2)  //最后一个元素出现的次数
			System.out.println(arr[N-1]);
		else
			System.out.println(candidate);
	}
public static void main(String[] args) {
	solve4(new int[] {0,1,2,1,1});
}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值