Java教程

蓝桥杯试题 算法训练 数的统计

本文主要是介绍蓝桥杯试题 算法训练 数的统计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

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

输入格式

  第一行正整数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

数据规模和约定

  数据:n<=1000;0<x<=1000,000。

给大家讲一下这个题的思路,想通了其实还是挺简单的:

首先就是一个含有n个数的数组,它可以有多个相同的数字,要求我们按照数字的大小,从小到大输出这些数字,并且输出该数字出现的次数。

第一我们可以先将这个数组从小到大进行排列,冒泡,选择,插入排序都可以,

为了防止某些同学不会,我讲一下选择排序:

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  • 初始状态:无序区为R[1..n],有序区为空;
  • 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了。
  • 代码实现:

for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
        if(f[i]>f[j])
            {
                t=f[i];
                f[i]=f[j];
                f[j]=t;
            }
        }
    }

排序完成以后,我们可以设置一个两层for循环和设置一个count=1在每次第二个for循环开始后,和选择排序差不多,但是我们在第一层中需要++count

先给大家看一下代码:

#include<stdio.h>
int main()
{
    int n,x,j,t,count,i;
    int f[1000];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&f[i]);
    }
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
        if(f[i]>f[j])
            {
                t=f[i];
                f[i]=f[j];
                f[j]=t;
            }
        }
    }
    for(i=0;i<n-1;i+=count)//假设我们数组里面有count个1那么我们在f[0],就可以把1有多少个知道,然后直接跳到1后面的数字;
    {   

        count=1;
        for(j=i+1;j<n;j++)
        {
            
            if(f[i]==f[j])
            {
                count++;//j从i+1开始,因为已经从小到大排列的,所以如果遇到和f[i]相等的数就count++;
            }
        }
        printf("%d %d",f[i],count);
    }
    return 0;
 } 

这篇关于蓝桥杯试题 算法训练 数的统计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!