数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力
也就是说,想法很简单,但实现起来 可能就不是那么回事了
先给大家简单的介绍一下数组
数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下表索引的方式获取到下表下对应的数据。举一个字符数组的例子,如图所示:
需要两点注意的是
- 数组下表都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址
例如删除下表为3的元素,需要对下表为3的元素后面的所有元素都要做移动操作,如图所示:
那么二维数组直接上图,大家应该就知道怎么回事了
那么这里要请同学思考一下,二维数组在内存的空间地址是连续的么?
我们来举一个例子,例如: int[][] rating = new int[3][4]; , 这个二维数据在内存空间可不是一个 3*4 的连续地址空间
看了下图,就应该明白了:
这个二维数组在内存中不是 3*4 的连续地址空间,而是四条连续的地址空间组成!
这我从leetcode上选出五道数组相关的常见面试题
- 第一道:leetcode 编号35,搜索插入位置,考察数据的基本操作,思路很简单,但是在通过率在简单题里并不高,不要轻敌。 暴力解法过了之后,再尝试一下使用二分法来解决这道题
- 第二道:leetcode 编号27,移除元素, 这道题目也是考察数据基本操作,想法简单,但是操作起来并不简单
- 第三道:leetcode 编号26,删除排序数组中的重复项 做完了 编号27的题目之后,在做26,可以增减对数组操作的理解
- 第四题:leetcode 编号209,长度最小的子数组, 这道题目暴力是也可以的,时间复杂度为O(n^2), 使用滑动窗口的办法来解决这道题目,不妨试试,时间复杂度为O(n)
- 第五题:leetcode 编号59,螺旋矩阵, 这道题真是是面试中的常客,特别是笔试的时候,而且这道题很多同学做过一遍,再去过,还是做不好。建议在循环遍历的时候需要定义好自己的循环不变量
希望通过这篇文章,可以帮助大家更深的理解数组。
后面我会介绍一下 数组相关的常见面试题型。
笔者介绍:
ACM亚洲区域赛铜牌获得者,哈工大计算机硕士毕业,先后在腾讯和百度采坑,欢迎关注「代码随想录」!这里有更多算法干货等着你呢