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

前言

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

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

思想与实现

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


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

代码:

#include
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的编译
后期会继续学习数据结构与算法(加油~)

你可能感兴趣的:(一个空间换取时间的编程题取数组中出现次数最多的数)