標籤:tis array 數組 相等 .so static name add null
問題描寫敘述 給定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();//得到數組aint[] 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> {@Overridepublic 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題 數字排序 解法和思路