//输出超过一半的数,如果没有则输出-1。通过编译,bymyself import java.util.*; public class MoreThanHalf{ public static void main(String args[]){ int array[]={3,4,5,3,2,3}; System.out.println(moreThanHalf(array)); } public static int moreThanHalf(int[] array){ Arrays.sort(array); Set sets = new TreeSet(); List lists = new ArrayList(); for(int i=0; i<array.length; i++){ sets.add(String.valueOf(array[i]));//String.valueOf!!! lists.add(String.valueOf(array[i])); } //转为字符串,才能使用indexOf StringBuffer sb = new StringBuffer(); Iterator it = lists.iterator(); while(it.hasNext()){ String s = (String)it.next(); sb.append(s); } String ss=sb.toString(); // it = sets.iterator(); while(it.hasNext()){ String s = (String)it.next(); int start = ss.indexOf(s); int end = ss.lastIndexOf(s); if(end-start+1>array.length/2){ return Integer.parseInt(s); } } return -1; } }
//输出超过一半的数,如果没有则输出-1。通过测试 import java.util.*; public class MoreThanHalf1{ public static void main(String args[]){ int array[]={3,4,5,3,2,3}; System.out.println(moreThanHalf(array)); } public static int moreThanHalf(int[] array){ if(array.length==1){//当数组中只有一个数时,要输出该数 return array[0]; } Arrays.sort(array); int count = 1; for(int i=0; i<array.length-1; i++){ if(array[i]==array[i+1]){ count++; if(count>array.length/2){//不是else if return array[i]; } }else{ count = 1; } } return -1; } }
//输出超过一半的数,如果没有则输出-1。通过编译.O(n) public class MoreThanHalf2{ public static void main(String args[]){ int array[]={3,4,5,3,3}; System.out.println(moreThanHalf(array)); } public static int moreThanHalf(int[] array){ if(array==null || array.length<=0){//null必须小写 return 0; } int middle = array.length>>1; int start = 0; int end = array.length-1; int index = partition(array,start,end); while(index!=middle){ if(index>middle){ end = index-1; index = partition(array,start,end); }else{ start = index+1; index = partition(array,start,end); } } int result = array[middle]; int times = 0; for(int i=0; i<array.length; i++){ if(array[i]==result){ times++; } } if(times*2<=array.length){ return 0; } return result; } public static int partition(int data[],int low,int high){ int k = data[low]; while(low<high){ while(low<high&&data[high]>=k){ high--; } if(low<high){ data[low++]=data[high]; } while(low<high&&data[low]<=k){ low++; } if(low<high){ data[high--]=data[low]; } } data[low]=k; return low; } }
推荐算法:
//输出超过一半的数,如果没有则输出-1。通过测试O(N) import java.util.*; public class test29{ public static void main(String args[]){ int array[]={3}; System.out.println(moreThanHalf(array)); } public static int moreThanHalf(int[] array){ int result = -1; int times = 0; for(int i=0;i<array.length;i++){ if(times==0){ result = array[i]; times=1; }else if(result==array[i]){ times++; }else{ times--; } } //判断result是否超过一半 times=0; for(int i=0;i<array.length;i++){ if(array[i]==result){ times++; } } if(times>array.length>>1){ return result; }else{ return -1; } } }