问题描述
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
样例输出
150
本题思路:
本题主要考察对数组重复数据次数的计算,首先计算数组中每个数据出现的次数,找出最大次数后取得该次数所对应的索引位置,再将数组去重后将该对应位置输出。
注意:
1、一定要注意N的取值范围,N小于1时不输出,题目设有陷阱。
2、本题给的评测数据感觉很不正常,我的程序测试了上百次都没有问题,但是提交时仍然只能过百分之90,不知道哪里出了点问题,欢迎大佬可以在下方评论帮我指正,有VIP的同学可以帮我查看一下第五个评测点的数据是什么,谢谢!
代码如下:
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//注意取值范围,题目设有陷阱
if (n < 1 || n > 20) {
return;
}
long arr[] = new long[n+1];
for (int i = 0; i < arr.length-1; i++) {
arr[i]=sc.nextLong();
}
//由于最后一个数据也要计算次数,因此在数组末尾添加一个不相干数据进行对比
arr[n]=-1;
//计算数据出现的次数,使用动态数组方便增删改
ArrayList<Integer> time = new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++) {
int num = 1;
for (int j = i+1; j < arr.length; j++) {
if(arr[i]==arr[j]){
num++;
}else{
time.add(num);
i = j-1;
break;
}
}
}
//计算次数最多的数据的索引位置
int index = 0;
for (int i = 0; i < time.size()-1; i++) {
if(time.get(i)<time.get(i+1)){
index=i+1;
}
}
//创建一个动态数据将原数组数据导入方便去重处理
ArrayList<Long> al = new ArrayList<Long>();
for (int i = 0; i < arr.length; i++) {
al.add(arr[i]);
}
//对动态数组去重
for (int i = 0; i < al.size()-1; i++) {
if(al.get(i).equals(al.get(i+1))){
al.remove(i);
}
}
//打印对应索引位置元素
System.out.println(al.get(index));
}
}