第三章:查找与排序(下)----------- 3.11 趣味拓展_寻找发帖水王

编程之美_寻找发帖水王:

变化:出现的次数恰好为个数的一半,求这个数。

关于加强版水王的题,可以通过扫描一遍数组就能解决问题:

水王占总数的一半,说明总数必为偶数;

不失一般性,假设每隔一个数就是水王的id,两两不同最后一定会消为0;

水王可能是最后一个元素,每次扫描到时候,多一个动作,和最后一个元素作比较,单独计数,计数恰好为一半;

如果不是,那么去掉最后一个元素,水王就是留下来的那个candidate

 

#include <iostream>
#include<algorithm>
using namespace std;

void waterKing(int arr[],int length){
	int candidate=arr[0];
	int nTime=0;
	int countOfLast=0;//统计最后这个元素出现的次数 
	int N=length;
	for(int i=0;i<N;i++){
		//增加与最后一个元素比较的步骤 
		if(arr[i]==arr[N-1]){
			countOfLast++;
		}
		if(nTime==0){
			candidate=arr[i];
			nTime=1;
			continue; 
		}
		if(arr[i]==candidate){
			nTime++;
		}
		else{
			nTime--;
		}
	}
	//最后一个元素出现的次数是n/2 
	if(countOfLast==N/2){
		cout<<arr[N-1];
	}
	else{
		cout<<candidate;
	}
}
 
int main()
{
	int arr[]={1,3,5,2,1,3,1,1};
	waterKing(arr,8);
	return 0;
}

结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值