描述
数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
输入
第一行 数组长度
第二行 数组元素
输出
整数
实例输入
5
1 2 3 4 4 4 4
实例输出
4
解题思路
解法一:
排序,输出数组一半的值
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.NextInt();
int[] arr = new int[n];
for(int i=0;i<arr.length;i++){
arr[i] = sc.NextInt();
}
Arrays.Sort();
System.out.println(arr[arr.length/2]);
}
解法二:
两个数不同就消掉
static int f(int[] arr){
int Val = arr[0];
int count = 1;
for(int i = 1;i<arr.length;i++){
if(count==0){
Val = arr[i];
count = 1;
continue;
}
if(Val == arr[i]){
count++;
}else{
count--;
}
}
return Val;
}
解法三
利用快速排序到Array.length/2
static int f(int[] arr,int begin,int end,int k){
if(begin < end){
int q = p(arr,begin,end);
if(q<k){
return f(arr,q+1,end,k);
}else if(q>k){
return f(arr,begin,q-1,k);
}else{
return arr[q];
}
}
}
static int p(int[] arr,int begin,int end){
int indexMid = (begin+end)>>1;
if(arr[begin]>=arr[indexMid] && arr[begin]<=arr[end]){
indexMid = begin;
}else if(arr[end]>=arr[begin] && arr[end]<=arr[indexMid]){
indexMid = end;
}
int t = arr[indexMid];arr[indexMid] = arr[begin];arr[begin] = t;
int poivt = arr[begin];
int left = begin+1;
int right = end;
while(left <= right){
while(left<=right && arr[left] <= poivt)left++;
while(left<=right && arr[right] <= poivt)right--;
if(left<right)
int t = arr[left];arr[left] = arr[right];arr[right] = t;
}
int t = arr[begin];arr[begin] = arr[right];arr[right] = t;
return right
}