1. 程式人生 > >CCP-CSP 數字排序 JAVA

CCP-CSP 數字排序 JAVA

問題描述

試題編號: 201503-2
試題名稱: 數字排序
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述:

問題描述

  給定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的非負整數。

答題欄

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int N = s.nextInt();
		
		//定義二維陣列、第0行存輸入資料,第1行存數出現的次數
		int[][] value = new int[2][N];
		int i, j, counter=0;
		
		//讀資料到陣列value[][]
		for(i=0; i<N; i++) {
			value[0][counter] = s.nextInt();
			value[1][counter] = 1;
			counter++;
			
			//迴圈判斷,陣列中是否已有輸入的資料,有,該數的出現次數加一。
			//並將counter-1為了是下一輸入的資料覆蓋,剛才輸入的重複資料。
			//若陣列中沒有剛輸入的資料,進行到下一輪迴圈。
			for(j=0; j<counter-1; j++) {
				if(value[0][j]==value[0][counter-1]) {
					value[1][j]++;
					counter--;
				}
			}
		}
		
		sort(value, counter);
		
		for(i=0; i<counter; i++) {
			System.out.printf("%d %d", value[0][i], value[1][i]);
			System.out.printf("\n");
		}

	}
	
	//插入排序
	public static void sort(int[][] v, int N) {
		int in, out, temp0,temp1;
		for(out=1; out<N; out++) {
			temp0 = v[0][out];
			temp1 = v[1][out];
			in = out;
			//while條件表示式:當前一個數出現的次數小於後一個數出現的次數或者
			//出現次數相同,但前一個數大於後一個數
			//滿足這兩種情況,前數向後移
			while((in>0&&v[1][in-1]<temp1)||in>0&&v[1][in-1]==temp1&&v[0][in-1]>temp0) {
				v[0][in] = v[0][in-1];
				v[1][in] = v[1][in-1];
				--in;
			}
			v[0][in] = temp0;
			v[1][in] = temp1;
		}
	}

}