前言
因为发现拉勾上有很多心仪的公司岗位要求要会数据结构与算法的,所以自己晚上在慢慢学习 数据结构与算法基础
,主要是看用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的编译
后期会继续学习数据结构与算法(加油~)
网友评论