题目要求:
这道题有很多做法,我自己用桶排序原理实现了一遍。但在网上看到了一个挺不错的思路,就自己再实现一遍。这是原作者的博客地址:https://blog.csdn.net/gamer_gyt/article/details/44541117
思路:
整体思路:定义两个数组,长度一致。数组1用来存放输入的数,数组2用来记录数组1元素出现的次数(数组2元素表示数组1出现相同的次数,数组2下标与数组1的下标一致,这样就可以用根据数组2的元素大小来判定arr1中哪些值是出现最多,然后找出最小的输出)。数组1与数组2的关系如下:
判断出现次数最多:先记录arr2中最大的元素max(也就是arr1中出现最多的数)和它的下标位置temp。接着将arr1中出现次数最多的数赋给min,然后找出最小的值输出。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int min = 0; //出现次数相同中最小的数
int max = 0; //arr2最大的元素
int temp = 0;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr1[] = new int[n]; //arr1作用:输入的数存放在arr1
int arr2[] = new int[n]; //arr2作用:将arr1元素出现的次数作为arr2的元素
for(int i=0;i<n;i++){
arr1[i] = sc.nextInt();
arr2[i] = 0; //将arr2元素都初始化
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){ //每个arr1每个元素都拿出来比较
if(arr1[j]==arr1[i]){ //判断相同的元素,arr2序号元素自增
arr2[i]++;
}
}
}
for(int i=0;i<n;i++){
if(arr2[i]>max){ //找出arr2中最大的元素
max = arr2[i]; //将arr2中最大的元素给max
temp = i; //用temp记住最大元素的下标位置
}
}
min = arr1[temp]; //在数组arr1中找到出现次数最多的那个元素
for(int i = 0;i<n;i++){
if(arr2[i] == max) { //判断arr2中元素存在等于max(max是arr2最大的元素)
if(arr1[i]<arr1[temp]){ //遇见相同次数的元素,选择最小的
min = arr1[i];
}
}
}
System.out.println(min);
}
}