编程之美_寻找发帖水王:
变化:出现的次数恰好为个数的一半,求这个数。
关于加强版水王的题,可以通过扫描一遍数组就能解决问题:
水王占总数的一半,说明总数必为偶数;
不失一般性,假设每隔一个数就是水王的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;
}
结果: