CCF計算機職業資格認證 2015年3月第2題 數字排序 解法和思路
阿新 • • 發佈:2018-03-01
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題 數字排序 解法和思路