问题描述
给定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
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int n=in.nextInt();
int arr[] = new int [n];
for(int i=0;i<n;i++)
{
arr[i]=in.nextInt();
}
Arrays.sort(arr);// 先把arr数组排序
int duan=0; //分段,有几个不同的数字就是几段
for(int j=1;j<n;j++)
{
if(arr[j]!=arr[j-1])
{
duan++;
}
if(j==n-1)
duan++;
}
int [][]brr =new int[duan][2];
int count =0;//每个数字出现的次数
int x,y;
x=0;y=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(arr[i]==arr[j])
{
count++;
}
}
if(i<n-1)
{
//由于arr数组已经排好序,相同的元素会排在一起,所以只需判断元素是否相等
//判断arr[i]是否等于arr[i+1]
//列如:1 1 3 3 5 5 7 7 7 8 9 9
// 1=1,True ,程序不做任何事情
//接下来 1=3,False,把arr[i]放入brr[x][y]元素中,brr[x][y]=arr[i]
//因为arr[i]出现次数为count,所以brr[x][y+1]=count
if(arr[i]!=arr[i+1] )
{
brr[x][y]=arr[i];
brr[x][y+1]=count;
x++;
}
}
else
{
brr[x][y]=arr[i];
brr[x][y+1]=count;
x++;
}
count=0;
}
/*****二维数组排序****/
sort(brr,duan,2);
}
public static void sort(int arr[][],int x,int y)//二维数组排序
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-i-1;j++)
{
if(arr[j][1]<arr[j+1][1])
{
int temp=0;
temp=arr[j][1];
arr[j][1]=arr[j+1][1];
arr[j+1][1]=temp;
int temp2=0;
temp2=arr[j][0];
arr[j][0]=arr[j+1][0];
arr[j+1][0]=temp2;
}
}
}
for(int i=0;i<x;i++)//打印结果
{
for(int j=0;j<y;j++)
{
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}