CCF计算机职业资格认证 2015年3月第2题 数字排序 解法和思路

问题描述

  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

输入格式

  输入的第一行包含一个整数n,表示给定数字的个数。

  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。

输出格式

  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。

样例输入

12

5 2 3 3 1 3 4 2 5 2 3 5

样例输出

3 4

2 3

5 3

1 1

4 1

评测用例规模与约定

  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。

思路:此题不算很难,最难的点在相等的次数要以值最小的先输出,也就是先按字数降序排列,次数一致的再按整数升序排列,最后输出。

一开始是想着一个TreeMap解决,然后按V值排序,这样提交时,只得70分,有case不过。后面想着还是再写一个类保存num和count吧,再实现comparator接口。按规则排序即可。

代码可能不是很精简,如有更好的方法,可以跟帖说明。

代码如下:

package sds;

import java.util.*;

public class Main {
	public static void main(String[] args){
		//接受输入
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		//得到数组a
		int[] a = new int[n];
		for(int i = 0; i < n; i++){
			a[i] = sc.nextInt();
		}
		//统计次数
		Map<Integer,Integer> map = new HashMap<Integer, Integer>();
		for(int i = 0; i < n; i++){
			if(map.get(a[i]) == null){
				map.put(a[i],1);
			}else{
				map.put(a[i],map.get(a[i]) + 1);
			}
		}
        ValueComparator bvc =  new ValueComparator();
        List<NumCount> list = new ArrayList<NumCount>();
        //添加到list
        for(int key:map.keySet()){
        	NumCount count = new NumCount(key, map.get(key));
        	list.add(count);
        }
        Collections.sort(list, bvc);//排序
        //打印
        for(int i = 0; i < list.size();i++){
        	System.out.println(list.get(i).getNum() + " " + list.get(i).getCount());
        }
	}
}

//实现排序
class ValueComparator implements Comparator<NumCount> {

	@Override
	public int compare(NumCount o1, NumCount o2) {
		if(o1.getCount() > o2.getCount())
			return -1;//降序排列
		if(o1.getCount() < o2.getCount())
			return 1;
		if(o1.getNum() > o2.getNum())
			return 1;//如果次数相同,再按整数升序
		if(o1.getNum() < o2.getNum())
			return -1;
		return 0;
	}
}
//保存数字和次数
class NumCount{
	private int num;
	private int count;

	public NumCount(int num,int count) {
		this.num = num;
		this.count = count;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-24 21:19:44

CCF计算机职业资格认证 2015年3月第2题 数字排序 解法和思路的相关文章

第六届CCF计算机职业资格认证考试题解(第三题)(画图)

之前在CSDN上看到别人的代码,跑了下,发现官方给的第一个测例是过不去的,但是提交上去之后是100分,猜测是判题系统中并没有使用题目中给的第一个测例. 另,之前自己写的代码是零分,后来发现是字符之间多输出了空格,以后还是要认真看题. 最后改了之后,是90分,后来经人指正,是没有考虑到划线时遇到'+'时的情况,不论是画'|'还是'-',遇到'+'时仍旧要保持'+'号. 原文:http://blog.csdn.net/jaster_wisdom/article/details/51059144 一下

CCF计算机职业资格认证考试 201809-2 买菜

以下内容过于幼稚,请大佬自觉绕道.. 题目描述: 时间限制:1.0s内存限制:256.0MB问题描述:问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车.具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]...[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]...[cn,dn]在装车.其中,一个时间段[s, t]表示的是从时刻s到时刻

无忧考吧一级MS办公软件2015年3月版破解

今天给大家演示一下如何绕过"无忧考吧一级MS办公软件2015年3月版"的激活程序,练习全部考题(一共71+5套题目) 声明:该博文只做交流使用,严禁作其他商业用途.希望文章能够引起相关软件公司的重视,及时修补漏洞. 破解思路:无忧考吧2014年9月发布的一级MS办公软件已经被破解(不是我干的),我今天就利用这个2014年破解版来运行2015年的未激活版. 1)登录百度网盘下载2014年9月份一级办公软件原始安装包和破解文件,网盘地址:http://pan.baidu.com/s/1i3

项目管理者联盟PMP认证与培训班针对2015年3月考试(3月22日开课)

美国项目管理学会全球教育合作伙伴(Global REP) 国家外专局培训中心授权机构 (全面针对PMBOK第五版考试) 面向对象 各类科技与研发.IT软件与通信.工程与设计等项目导向型企业的各级管理人员与项目管理人员.项目经理与技术经理,有志于成长为项目经理的优秀工程师与技术骨干. 课程优势 十余年美国项目管理学会全球教育合作伙伴(Global R.E.P. No. 3254),2003年开始PMP培训,课程质量业界认可,服务专业.专注. 国内最强大的PMP专家团队.主讲老师具备世界500强外资

项目管理者联盟PMP认证与培训班针对2015年3月考试(5月9日开课)

美国项目管理学会全球教育合作伙伴(Global REP) 国家外专局培训中心授权机构 (全面针对PMBOK第五版考试) 面向对象 各类科技与研发.IT软件与通信.工程与设计等项目导向型企业的各级管理人员与项目管理人员.项目经理与技术经理,有志于成长为项目经理的优秀工程师与技术骨干. 课程优势   十余年美国项目管理学会全球教育合作伙伴(Global R.E.P. No. 3254),2003年开始PMP培训,课程质量业界认可,服务专业.专注. 国内最强大的PMP专家团队.主讲老师具备世界500强

项目管理者联盟PMP认证与培训班针对2015年3月考试(1月24日开课)

美国项目管理学会全球教育合作伙伴(Global REP) 国家外专局培训中心授权机构 (全面针对PMBOK第五版考试) 面向对象 各类科技与研发.IT软件与通信.工程与设计等项目导向型企业的各级管理人员与项目管理人员.项目经理与技术经理,有志于成长为项目经理的优秀工程师与技术骨干. 课程优势  十余年美国项目管理学会全球教育合作伙伴(Global R.E.P. No. 3254),2003年开始PMP培训,课程质量业界认可,服务专业.专注. 国内最强大的PMP专家团队.主讲老师具备世界500强外

ccf历年真题(截至2015年9月)

问题描述 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔. 输出格式 输出一个整数,表示给定的数列有多个段. 样例输入 8 8 8 8 0 12 12 8 0 样例输出 5 样例说明 8 8

《计算机问题求解》总结——2014年CCF计算机课程改革导教班(2014.07.11)

一:引言 "心想事成",这是自己获得导教班学习机会的最佳概括.2013年年末学习李晓明老师的<人群与网络>课程:随后网络认识烟台大学贺利坚老师,了解到2013年导教班的学习内容:注册成为CCF会员,进而提交申请书并被录取为学员. 二:一周学习总结 一周学习时间很短,收获良多.除了课堂教学,优良的培训环境(北京怀柔区红螺园饭店,离市区坐公交车需要2个小时),让学员与老师能够专注交流,早中晚的餐桌交流成为了保留节目.有一半以上的时间都尽可能与陈老师.李老师等同桌.罗斯福总统有&

估价领域职业资格

中华人民共和国人力资源和社会保障部的的官方网站发布<人力资源社会保障部关于清理规范职业资格第一批公告>, 根据该公告,房地产估价师列入职业准入类职业资格,房地产经纪人列入职业水平评价类职业资格. 在估价领域,列入职业准入类职业资格的还有:价格鉴证师和价格评估人员,保险公估从业人员: 列入职业水平评价类职业资格的有:注册资产评估师.矿业权评估师. 注册资产评估师因所依循的只有<注册资产评估师执业制度暂行规定>所以被列为水平类,而房地产估价师因为有<城市房地产管理法>可依循