CSP/CCF计算机职业资格认证题目:[201503-2 数字排序]【已解决】(含注释)

问题描述

给定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();
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值