美文网首页
一个空间换取时间的编程题取数组中出现次数最多的数

一个空间换取时间的编程题取数组中出现次数最多的数

作者: timeQuick | 来源:发表于2019-04-01 18:51 被阅读0次

    前言

    因为发现拉勾上有很多心仪的公司岗位要求要会数据结构与算法的,所以自己晚上在慢慢学习 数据结构与算法基础,主要是看用C++来实现视频教学。在课上老师讲时间复杂度和空间复杂度是可以相互转化的。两个概念的理解就是:

    • 空间换时间:对于执行的慢,耗时的程序,可以通过消耗内存(即构造新的数据结构)来进行优化。
    • 时间换空间:对于消耗内存的程序,也可以多消耗时间来降低内存的消耗。
      后面在讲空间换时间时出了一个编程题来便于理解。题如下:
      在一个由自然数0-1000中任意数 组成的一维数组中,每个数可能会出现零次或者多次,找出一维数组中出现次数最多的数,并将其出现的次数打印出来!
      自己对算法很陌生,当时看到这个是想不出来用什么方法的。

    思想与实现

    思想:是以空间换取时间,在这道编程题中就是重新构造一个数组,这个数组用来存放原数组中每个数字
    出现的次数,而这个数组中每个数的下标是原数组中的每个数。(想通了这个的话就很简单)
    在Mac 上Visual studio code上实现如下:
    自己还调试了一遍因为出现次数最多的数可能有好几个(这里有一个bug,后一方法解决了这个)。


    屏幕快照 2019-04-01 下午6.46.33.png

    代码:

    #include<iostream>
    using namespace std;
    
    void searchMostNumber(int a[],int len){
        int save[1000] = {0};  //新建一个数组 初使值为0
        int max = 0;  //出现最多数的次数
        int key ;  //出现最多的数
    
        for(size_t i = 0; i < len; i++) 
        {
            /* code */
            int index = a[i]; //构建新的数组 以a中值为下标,数的次数为值
            save[index]++;
        }
        for(size_t i = 0; i < 1000; I++)
        {
            /* code */
            if (max < save[i])  {
                /* code */
                max = save[i];  //取最大的次数
                key = i;  //取出现最多的数
            }
            
        }
        //这一条是解决有几个最多次数的数
        for(size_t i = 0; i < 1000; I++)
        {
            /* code */
            if (max == save[i]) {
                /* code */
                printf("这个数组中出现最多的数是:%zu,出现了%d次\n",i,save[i]);
            }
            
        }
        
        
        
    }
    
    
    
    int main()
    {
        int array[] = {1,3,3,2,202,202,202,202,4,7,9,34,3,3,202,202,202,202,3,7,7,7,202,202,202,202,3,3,3,202,202,202,202,101,202,199,3};
        int b[] = {1,3,3,3,4,4,4};  //测试有多个最大数的情况
        int lengTemp = sizeof(array)/sizeof(*array);
        printf("数组array中---------");
        searchMostNumber(array,sizeof(array)/sizeof(*array));
         printf("数组b中---------");
        searchMostNumber(b,sizeof(b)/sizeof(*b));
        printf(" hello world 好好学习,天天向上\n");
     
        return 0;
    }
    
    

    输出结果:


    结果.png

    总结:
    让自己学会了在mac 上VS code的编译
    后期会继续学习数据结构与算法(加油~)

    相关文章

      网友评论

          本文标题:一个空间换取时间的编程题取数组中出现次数最多的数

          本文链接:https://www.haomeiwen.com/subject/qitbbqtx.html