【蓝桥杯练习题】出现次数最多的整数

问题描述


  编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  输入格式:第一行是一个整数NN £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
样例输出
150

代码实现
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class 统计出现最多次数的数 {
	
	//该函数完成统计功能并输出出现次数最多的数
	private static void countNum(Integer[] arr){
		//用来统计每个数的出现次数,Map的Key表示数,Value表示出现的次数
		Map<Integer,Integer> numMap = new HashMap<Integer,Integer>();
		for(int i=0; i<arr.length; ++i){
			if(numMap.containsKey(arr[i])){
				//如果该数已经在出现过,则将该数的次数加一
				numMap.put(arr[i], numMap.get(arr[i])+1);
			}else{
				//若没有出现则加入Map中,次数置为一
				numMap.put(arr[i], 1);
			}
		}
		//接下来按照Map的Value值进行降序排列,但由于对Map的排序操作不方便,
		//故将Map的数据转换为对应的字符串,然后对字符串进行排序
		String[] numStr = new String[numMap.size()];
		int i = 0;
		for(Entry<Integer,Integer> entry : numMap.entrySet()){
			//字符串格式: 次数,数字
			numStr[i++] = entry.getValue()+","+entry.getKey();
		}
		sortStr(numStr);//对数据字符串进行排序
		//数组首元素即为要求输出的数字
		System.out.println(numStr[0].split(",")[1]);

	}
	
	//依赖两种比较条件的排序
	private static void sortStr(String[] numStr){
		for(int i=0; i<numStr.length; ++i){
			//将字符串以“,”为分隔符分割,对分割后的第一部分即次数为主序使用冒泡法进行排序
			String[] str1 = numStr[i].split(",");
			for(int j=0; j<i; ++j){
				String[] str2 = numStr[j].split(",");
				if(str1[0].compareTo(str2[0]) > 0){
					String temp1 = numStr[i];
					numStr[i] = numStr[j];
					numStr[j] = temp1;
				}else if(str1[0].compareTo(str2[0]) == 0){
				//若不同的数字出现次数相同,则按照数字的大小进行升序排列,目的为了将出现次数
				//最多的中的最小的数放在数组首位
					if(str1[1].compareTo(str2[1]) < 0){
						String temp2 = numStr[i];
						numStr[i] = numStr[j];
						numStr[j] = temp2;
					}
				}
			} 
		}
	}
	
	public static void main(String args[]){
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();//表示要输入数据的个数
		Integer[] arr = new Integer[n];
		for(int i=0; i<n; ++i){
			arr[i] = scan.nextInt();
		}
		countNum(arr);//该函数完成统计功能并输出出现次数最多的数
	}
}

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值