1. 程式人生 > >CCF計算機職業資格認證 2015年3月第2題 數字排序 解法和思路

CCF計算機職業資格認證 2015年3月第2題 數字排序 解法和思路

integer pack 可能 edit val tree cli 提交 edi

問題描寫敘述   給定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計算機職業資格認證 2015年3月第2題 數字排序 解法和思路