水王问题的实质就是如何快速在一串连续的数字里找到出现次数超过一半的数字。重点是最快,通过老师给出的算法思路,进行设计把这串数字放到一个数组里面,两个相邻的数字去做比较,如果相等,在向后比较,如果不等把这两个数字都置为0,标明这两个数字已经相互抵消。水王的数字最多,最后数组里面只有水王的数字(0不用去管,水王的数字是一个非零数)。
1 public class Main { 2 public static void main(String[] args) 3 { 4 //把i帖子序号d列表放到一个数组里面 5 int[] idNum = {1,1,1,4,12,3,11,1,1,15,6,6,77,1,1,8,1}; 6 //指向前一个数和后一个数的指针 7 int up = 0; 8 int next = 1; 9 //通过while循环来实现两两相消法 10 while((up < idNum.length-1)&&(next < idNum.length)) 11 { 12 //如果前一个数字和后一个数字相等则指针顺次向后移动一位 13 if(idNum[up] == idNum[next]) 14 { 15 up = up + 1; 16 next = next + 1; 17 } 18 //如果前一个数和后一个数不相等这两个数就相互消去指针顺次移动两位 19 else 20 { 21 idNum[up] = 0; 22 idNum[next] = 0; 23 up = up + 2; 24 next = next + 2; 25 } 26 } 27 28 //两两相消完之后找到第一个不是0的数组元素找到了水王的id 29 next = 0; 30 while(next < idNum.length) 31 { 32 if(idNum[next] != 0) 33 { 34 System.out.println("水王是"+idNum[next]); 35 break; 36 } 37 else 38 { 39 next = next + 1; 40 } 41 } 42 43 } 44 45 }