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

原创 2015年07月10日 16:42:55
问题描述
  给定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;
	}

}



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

CCF计算机职业资格认证考试资料 部分题目答案 题库

CCF计算机职业资格认证考试资料 数据范围 类型 字节 表示范围 signed char 1 -128~+127 ...
  • fkuevip
  • fkuevip
  • 2015年09月12日 21:19
  • 3121

2016 CCF-CSP 计算机职业资格认证考试 解题报告

嘛,参加这次考试属于一连串比较机缘巧合的事情—— 首先是当上了2016年度CCF优秀大学生的荣誉,这个奖颁发的同时也赠予了为期一年的CCF会员资格 而会员……是具有一次免费参加CCF计算机职业资格认证...
  • okcd00
  • okcd00
  • 2017年01月03日 19:38
  • 4666

CCF数字排序JAVA答案

试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: ...
  • luobohendanchun
  • luobohendanchun
  • 2017年03月20日 03:12
  • 766

CCF认证历年试题解【网上跟帖,请不要使用称呼】

程序改变现实,软件统治世界。 程序员需要有精益求精的工匠精神,追求逻辑的极简、时间的最少和存储的最省,并且懂得其中的平衡。 数据表示需要优先考虑,对于许多问题,找到表示该问题的数据结构,问题自然就解决...
  • tigerisland45
  • tigerisland45
  • 2017年01月28日 00:49
  • 30589

CSP考试 2017年3月第2题 学生排队 C++实现

#include using namespace std; int main() { int NUM; cin>>NUM; int jg[NUM]; for(int i=0;i>m; fo...
  • woniupengpeng
  • woniupengpeng
  • 2017年03月23日 18:05
  • 1168

2016年4月CCF计算机软件能力认证模拟试题代码参考

问题描述 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。 输入的第二行有n...
  • qwb492859377
  • qwb492859377
  • 2016年03月21日 21:46
  • 5350

CCF认证 2015年3月4题

试题编号: 201503-4 试题名称: 网络延时 时间限制: 1.0s 内存限制: 256.0MB 问题描述: ...
  • u012395979
  • u012395979
  • 2015年09月12日 21:55
  • 389

CCF模拟题——有趣的数详解

马上就要参加CCF认证考试了,然后最近就在做CCF上的模拟题,我选的语言是java,然后遇到第四题——有趣的数,当时一看题目,卧槽太TM简单了,比第一题和第二题还简单,高兴死我了,然后我就做呗,然后我...
  • liuyongjie985
  • liuyongjie985
  • 2015年03月21日 16:39
  • 3947

CCF认证试题 及答案

问题描述  试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制:  256.0MB  问题描述:    给定n个正整数,找出它们中出现次数最多的数。如果...
  • yisandezhuiqiu
  • yisandezhuiqiu
  • 2016年10月31日 22:58
  • 2515

CCF201503-2 数字排序(100分)

试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给定n个整数,请统计出每个整数出现的次...
  • tigerisland45
  • tigerisland45
  • 2017年01月29日 10:29
  • 2236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CCF计算机职业资格认证 2015年3月第2题 数字排序 解法和思路
举报原因:
原因补充:

(最多只允许输入30个字)