package Arraysum; public class FindWaterKing { public static void main(String[] args) { //把id列表放到一个数组里面 int[] idNum = {1,1,1,1,12,3,11,1,1,15,6,6,77,1,1,1,1}; //指向前一个数和后一个数的指针 int previor = 0; int next = 1; //通过while循环来实现两两相消法 while((previor < idNum.length-1)&&(next < idNum.length)) { //如果前一个数字和后一个数字相等则指针顺次向后移动一位 if(idNum[previor] == idNum[next]) { previor = previor + 1; next = next + 1; } //如果前一个数和后一个数不相等这两个数就相互消去指针顺次移动两位 else { idNum[previor] = -1; idNum[next] = -1; previor = previor + 2; next = next + 2; } } //两两相消完之后找到第一个不是-1的数组元素找到了水王的id next = 0; while(next < idNum.length) { if(idNum[next] != -1) { System.out.println(idNum[next]); break; } else { next = next + 1; } } } }
找水王问题的实质就是如何快速在一串连续的数字里找到出现次数超过一半的数字。我用的是老师提供的思路,把这串数字放到一个数组里面,两个相邻的数字去做比较,如果相等,在向后比较,如果不等把这两个数字都置为-1,标明这两个数字已经相互抵消。水王的数字最多,最后数组里面只有水王的数字和-1。
时间: 2024-10-23 03:50:48