问题描述
试题编号: | 201503-2 |
试题名称: | 数字排序 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 输入格式 输入的第一行包含一个整数n,表示给定数字的个数。 输出格式 输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。 样例输入 12 样例输出 3 4 评测用例规模与约定 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;
}
}
}