题目描述
设计思想
若要统计所有数字的出现次数,则水王的出现次数减去其余数字的次数所得的结果大于0,因此我们可以将统计所有数字出现次数转变为统计每个数字出现次数与其余数字出现次数之差。具体的实现方式是从头开始将第一数设置为候选数,出现次数为1,将其与相邻的下一个数作比较,若相等则次数加一否则减一,若此时该候选数的次数被减为0则将下一个数作为候选数重复此步骤,最终剩下的即为水王。其中有一种极端情况是水王的出现次数占一半且将其余数字依次隔开,此时按照上述算法则没有结果,此时水王出现在最后一位,只需要额外统计最后一位的出现次数将其与全长的一半比较即可,若刚好为一半则确定为水王。
package findWaterKing; public class findWaterKing { public static void main(String[] args) { find(new int[]{1,6,2,6,3,6,4,6,5,6}); } private static void find(int[] is) { int candidate=is[0]; int times=0; int count=0; for (int i = 0; i < is.length; i++) { if (is[i] == is[is.length-1]) { count++; } if (times == 0) { candidate = is[i]; times = 1; continue; } if (is[i] == candidate) { times++; } else { times--; } } if (count == is.length/2) { System.out.println(is[is.length-1]); } else { System.out.println(candidate); } } }
结果截图: