43 最高频率

问题描述 :

明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸和明明玩起了一个数字游戏,这个游戏的名字叫“最高频率”。在游戏中,明明的爸爸要求明明在一串数字中,找出出现次数最多的那个数字,如果有多个数字出现的次数一样,则取最小的那个数字。明明很快就理解的游戏的规则,开始玩起来。明明的爸爸首先给了明明三个数字:3、2、1;明明很快就回答说:“1”(虽然3、2都出现一次,但是1是最小的数字,因此答案是1)。明明的爸爸很惊讶于明明的反应速度,开始加大游戏的难度,给出了由6个数字组成的数字串:2、1、3、4、5、2;明明眼珠子一转,脱口而出:“2”。明明的爸爸意识到简单的数字串很难难住明明,于是决定给出很长的一串字符串来考明明。但与此同时,明明爸爸面对这很长的数字串,也无法一时就统计出哪个数字出现的次数最高。于是就求助于你,让你帮他写一个程序,用来计算出出现次数最多的那个数字。 明明的爸爸的问题可以归结为:给你一个数字串,里面有n个数字,输出这个数字串中出现次数最多的那个数字;如果有多个数字出现次数一样,则输出其中最小的那个数字。

输入说明 :

你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行开始有一个正整数n(1 ≤ n ≤ 200),表示数字串中有n个数字;之后有n个数字,表示数字串中的n个数,其中每个数都大于等于1且小于等于109;每个数字之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序需要计算出一组相应的运算结果,并将每组运算结果依次写入到标准输出设备(通常为启动该程序的文本终端,例如Windows中的命令行终端)中。每组运算结果为一个整数,即这个数字串中出现次数最多的那个数字;如果有多个数字出现次数一样,则输出其中最小的那个数字。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。

输入范例 :

1 100
5 5 3 77 23 10

输出范例 :

100
3

 

思想:先按大小排序,之后将有序数据传入函数中,然后用动态规划思想求解,

使用一个和传入数据等大的数组res用来保存遍历到对应位置时的出现频率最多的元素,用一个计数器c用来记录当前数据重复的次数,

每次比较当前数据i和resi-1,前一个位置出现次数最多的元素是否相等,

如果相等则将计数器+1,将当前出现次数最多的元素res[i]置为上一个位置出现次数最多的元素res[i-1],

如果不等,说明出现了新元素,先判断是否从当前位置+c的元素和当前位置相等,

  如果是的话,说明需要更新当前位置出现次数最多元素为nums[i],同时将c置为1,进行新元素的计数,

  如果不是的话,则将当前出现次数最多的元素res[i]置为上一个位置出现次数最多的元素res[i-1],继续新元素的遍历。

 

 

#include <stdio.h>



int count(int num,int nums[]){
    int res[num];
    int c = 1;
    int i,j,k;
    res[0] = nums[0];
    for(i=1;i<num;i++){
        if(nums[i] == res[i-1]){
            res[i] = res[i-1];
            c++;
        }else{
            if (nums[i+c]==nums[i])
            {
                res[i] = nums[i];
                c = 1;
            }else{
                res[i] =res[i-1];
            }
        }
    }
    return res[num-1];
}

int main()

{
    int nums[200];
    int num=0;
    int i,j,k,t;
    int res;
    while (scanf("%d",&num)!=EOF){
        for(i = 0;i<num;i++){
            scanf("%d",&nums[i]);
        }
        for(k=0;k<num;k++){
            for (j=k+1;j<num;j++)
                if(nums[k]>nums[j])    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
                {
                    t=nums[k];
                    nums[k]=nums[j];
                    nums[j]=t;
                }
        }
        res = count(num,nums);
        printf("%d\n",res);

    }
    
    
    
    return 0;
}

 

上一篇:【nodejs基础】解决跨域问题


下一篇:3769 移动石子(模拟)