数量正好占是数组长度一半的数
题:寻找发帖水王,出现次数恰好为个数的一半,求出这个数
/*
* 水王占总数的一半,说明总数为偶数
* 水王不失一般性,假设隔一个数就是水王的id,两两不同最后一定会消减为0
* 水王可能是最后一个元素,每次扫描的时候,多一个动作,与最后一个元素进行比较,单独计数,若恰好为数量的一半,则为水王
* 如果不是,计数不足一半,那么去掉最后一个元素,水王就是candidate
*/
//不同的数进行消除
public static int solve(int[] arr) {
//候选数
int candidate = arr[0];
//出现的次数
int nTimes = 1;
int countOfLast = 0; //统计最后这个元素出现的次数
for(int i=1; i<arr.length; i++) {
if(arr[i] == arr[arr.length-1])
countOfLast++;
//两两消除减为0,应该把现在的元素作为候选值
if(nTimes == 0) {
candidate = arr[i];
nTimes = 1;
continue;
}
//遇到与候选值相同的,次数加1
if(arr[i] == candidate)
nTimes++;
else
nTimes--;
}
if(countOfLast == arr.length/2)
return arr[arr.length-1];
else
return candidate;
}