CCF201503-2数字排序(C语言)

题目

问题描述
  给定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的非负整数。

问题分析

该题目可用一个数组,以下标作为数,数组内容存储该数出现次数来实现(这就相当于直接映射,
是机试题目里面常用的一种解题法,很多看似非线性的题型最后其实都可以采取哈希或者映射的方法来巧解,
尤其是一些看似是树形结构的模拟类题目,要好好体会哈希思想在机试题目中的巧用)。

C语言实现的源代码(100分)

法一:

#include 
#include 
#define N 1000
int getMaxtimesPos(int array[],int low,int high)
//在array[low..high]中选择最大的数,返回在数组中的下标值。若相等,返回较小的下标值。
{
     
	int i,max = array[low],max_pos = low;
	for(i=low;i<=high;i++)
	{
     
		if(max < array[i])
		{
     
			max = array[i];
			max_pos = i;
		}
		if(max == array[i])
		{
     
			if(max_pos > i)
				max_pos = i;
		}
	}
	return max_pos;
}

int main()
{
     
	int i,n,array[N],value,low,high,index;
	memset(array,0,sizeof(array));
	scanf("%d",&n);
	scanf("%d",&value);		//先输入一个数,为low和high赋初值 
	array[value]++;
	low = value;
	high = value;
	for(i=1;i<n;i++)
	{
     
		scanf("%d",&value);
		array[value]++;		//用数组下标作为数,数组内容存储该数出现次数
		if(low > value)		
			low = value;	//记下输入的数据中最大的数,以确定array数组的范围 
		if(high < value)
			high = value;	//记下输入的数据中最小的数,以确定array数组的范围 
	}
	for(i=0;i<n;i++)
	{
     
		index = getMaxtimesPos(array,low,high);
		if(array[index])
		{
     
			printf("%d %d\n",index,array[index]);
			array[index] = 0;		//输出后将array[index]置为0 
		}
	}
	return 0;
}

法二:
注意:法二在提交时选择C语言会编译出错,选择C++是100分

#include 

struct Number
{
     
	int num;
	int freq;
} number[1000];

int main()
{
     
	int i, j, n, value, count, max = 0, max_index = 0;
	Number temp;
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
     
		scanf("%d", &value);
		for(j = 0; j < i; j++)
		{
     
			if(number[j].num == value)	//如果当前数字之前已出现过 
			{
     
				number[j].freq++;
				break;
			}
		}
		if(j == i)	//如果当前数字之前未出现过 
		{
     
			number[count].num = value;
			number[count].freq++;
			count++;
		}
	}
	
	for(i = 0; i < count - 1; i++)	//选择排序 
	{
     
		max = number[j].freq;
		max_index = j; 
		for(j = i; j < count; j++)
		{
     
			if(max < number[j].freq)
			{
     
				max = number[j].freq;
				max_index = j;
			}
			else if(max == number[j].freq)	//注意如果两个数字出现次数相同的情况 
			{
     
				if(number[j].num < number[max_index].num)
					max_index = j;
			}
		}
		if(i != max_index)
		{
     
			temp = number[i];
			number[i] = number[max_index];
			number[max_index] = temp;
		}
	}
	
	for(i = 0; i < count; i++)
		printf("%d %d\n", number[i].num, number[i].freq);
	return 0;
}

你可能感兴趣的:(CCF)