题目
数组中有一个数字的出现的次数超过了数组长度的一半,找出这个数字
解法1
统计每个数字出现次数
package com.company;
import java.util.Arrays;
public class Test23 {
public static void main(String[] args) {
int[] arr={5,20,5,5,69,5,5};
//求69这个最大值
int max=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
max=arr[i];
}
}
System.out.println( max );
//70的下标数组
int[] index=new int[max+1];
for (int i = 0; i < arr.length; i++) {
index[arr[i]]++;
}
System.out.println(Arrays.toString(index));
int half=0;
if(arr.length%2==0){
half=arr.length/2;
}else{
half=arr.length/2+1;
}
System.out.println(half);
for (int i = 0; i < index.length; i++) {
if(index[i]>half){
System.out.println(i);
break;
}
}
}
}
解法2
先排序,中间值就是答案。
为了练练手,用的基数排序
package com.company;
import com.company.util.ArrayUtil;
import java.util.ArrayList;
import java.util.Arrays;
public class Test22 {
public static void main(String[] args) {
int[] arr={5,20,5,5,69,5};
// int[] arr = ArrayUtil.randomArray(1, 1000, 10);
ArrayList<Integer>[] barrel=new ArrayList[10];
for (int i = 0; i < barrel.length; i++) {
barrel[i]=new ArrayList<>();
}
// barrel[0]=new ArrayList<>();
// barrel[0].add(10);
// System.out.println(barrel[0].get(0));
for (int k = 0; k <3 ; k++) {
for (int i = 0; i < arr.length; i++) {
int temp=arr[i];
for (int j = 0; j < k; j++) {
temp/=10;
}
int num=temp%10;
barrel[num].add(arr[i]);
}
printBarrel(barrel);
int j=0;
for (int i = 0; i < barrel.length; i++) {
for (Integer num:barrel[i]){
arr[j]=num;
j++;
}
}
System.out.println(Arrays.toString(arr));
for (int i = 0; i < barrel.length; i++) {
barrel[i].clear();
}
}
System.out.println(arr[arr.length/2]);
}
public static void printBarrel(ArrayList<Integer>[] barrel){
for (int i = 0; i < barrel.length; i++) {
System.out.println("桶"+i+":");
for (Integer num:barrel[i]){
System.out.print(num+" ");
}
System.out.println();
}
}
}