【经典问题】从小到大依次输出序列中出现的数及出现的次数


1、题目

在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。如序列3,1,2,1,5,1,2。其中1就出现3次,2出现2次,3出现1次,5出现1次。要求对于给定的正整数序列,从小到大依次输出序列中出现的数及出现的次数。

数据约定

n<=100; 0<x<1000000.

输入

第一行正整数n,表示给定序列中正整数的个数。第二行是n个用空格隔开的正整数x,代表给定的序列。

输出

若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数第二个是该数在序列中出现的次数。

样例输入

12
8 2 8 2 2 11 1 1 8 1 13 13

样例输出

1 3

2 3

8 3

11 1

13 2

2、代码

首先,先从控制台输入数据保存到目标数组中;其次给目标数组元素进行从小到大排序;最后再进行数据统计。

/*******************************************************************************************************
** 题    目: 在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。如序列3,1,2,1,5,1,2。
		     其中1就出现3次,2出现2次,3出现1次,5出现1次。要求对于给定的正整数序列,从小到大
			 依次输出序列中出现的数及出现的次数。
** 数据约定:n<=1000; 0<x<1000000.			 
** 输    入: 第一行正整数n,表示给定序列中正整数的个数。
			 第二行是n个用空格隔开的正整数x,代表给定的序列。
** 输    出: 若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数
			 第二个是该数在序列中出现的次数。
** 样例输入:12
			 8 2 8 2 2 11 1 1 8 1 13 13
** 样例输出:1 3
			 2 3
			 8 3
			 11 1
			 13 2
********************************************************************************************************/
#include <stdio.h>
#include <string.h>


void swap(int *array, int i, int j);
void BubbleSortSmallToBig(int *array, int len); // O(n*n)	

// 主函数
int main(void)
{
	// 数据输入
	int n;
	scanf("%d", &n);
	
	int arr[n];
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	
	// 从小到大排序
	BubbleSortSmallToBig(arr, n);
	
	// 处理方式如下
	int j = 0;
	int tmp = 0;
	int num = 0;
	while (j != n)
	{
		tmp = arr[j];
		while (tmp == arr[j])
		{
			num++;
			j++;
		}
		 printf("%d %d\n", tmp, num);
		 num = 0;
	}
	return 0;
}

// 数组内元素交换
void swap(int *array, int i, int j)
{
	int temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}

// 从小到大排序
void BubbleSortSmallToBig(int *array, int len) // O(n*n)
{
	int i = 0;
	int j = 0;
	
	for(i=0; i<len; i++)
	{
		for(j=len-1; j>i; j--)
		{
			if( array[j] < array[j-1] )
			{
				swap(array, j, j-1);
			}
		}
	}
}

运行结果



文章作者: 杂烩君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杂烩君 !
  目录