1 package algorithms; 2 3 /** 4 * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 5 * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。 6 * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 7 * 如果不存在则输出0。 8 * 9 * **/ 10 public class MoreThanHalfNum { 11 //思路一:某个数出现的次数超过一半 则其出现的次数比其他所有出现的次数都多 12 //因此,我们可以在遍历数组的时候保存两个值,一个是数字,另一个是次数 13 //当我们遍历到下一个数字的时候,如果两数相同 则次数加一 14 //若不同 则次数减一 15 //若次数减为0 则保存下一个数字 16 public int MoreThanHalfNum_Solution(int [] array) { 17 if(array.length==0) 18 return 0; 19 int times = 0; 20 int now = array[0]; 21 for(int i=0;i<array.length;i++) { 22 if(now == array[i]) 23 times++; 24 else 25 times--; 26 if(i<array.length-1 && times==0) 27 now = array[i+1]; 28 } 29 int count=0; 30 for(int i=0;i<array.length;i++) { 31 if(now==array[i]) 32 count++; 33 } 34 if(count*2<=array.length) 35 return 0; 36 return now; 37 38 } 39 40 //思路二:如果数组中某个数字的次数超过一半,则将该数组排序后,中间位置上的数一定是该数字 41 //学会使用Arrays工具类 42 /* 43 * public class Solution { 44 public int MoreThanHalfNum_Solution(int [] array) { 45 int len=array.length; 46 if(len<1){ 47 return 0; 48 } 49 int count=0; 50 Arrays.sort(array); 51 int num=array[len/2]; 52 for(int i=0;i<len;i++){ 53 if(num==array[i]) 54 count++; 55 } 56 if(count<=(len/2)){ 57 num=0; 58 } 59 return num; 60 } 61 } 62 */ 63 }