1,数组

数组

数组,将元素存储到内存的连续位置中,是最基本的数据结构。在任何和编程相关的面试中,都会被问到和数组相关的问题,可以说是非常热门的考题之一。比如:将数组反转、对数组进行排序、搜索数组中的元素等。

数组数据结构的主要优点是如果知道索引就可以通过 O(l) 进行快速搜索,但是在数组中添加和删除元素的速度会很慢,因为数组一旦被创建,就无法更改其大小。如果需要创建更长或更短的数组,得先创建一个新数组,再把原数组中的所有元素复制到新创建的数组中。

解决数组相关问题的关键是要熟悉数组的数据结构和基本的构造,如循环、递归等等;下面给出了 10 道热门面试题帮助大家掌握知识并进行练习。

数组三特性

  • 一种线性表数据结构

  • 用一组连续的内存空间,存储一组具有相同类型的数据-》可以随机访问,但删除插入为保证连续性就低效

数组怎么实现随机访问?元素存储的内存地址:a[i]_address = base_address + i * data_type_size

线性表:数组、链表、栈、队列

非线性表(数据不是单纯的前后关系):树、图、堆

 

数组和链表的区别?

数组适合查找操作,支持随机访问,根据下标随机访问的时间复杂度为O(1);

链表适合插入删除,时间复杂度为O(1)

 

数组的删除

每次的删除操作并不是真正的搬移数据,只是记录数据已经被删除;当数组没有更多空间存储数据时,再次触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。这就是JVM标记清除垃圾回收算法的核心思想

 

警惕数组的访问越界问题

很多计算机病毒也正是利用到了代码中的数组越界可以访问非法地址的漏洞,来攻击系统。

 

容器是否能完全替代数组?

容器如Java的ArrayList,C++中的vector

数组本身在定义的时候需要预先指定大小,因为需要分配连续的内存空间。如果我们申请了大小为 10 的数组,当第 11 个数据需要存储到数组中时,我们就需要重新分配一块更大的空间,将原来的数据复制过去,然后再将新的数据插入。

容器不需要关心底层的扩容逻辑,每次存储空间不够时,它会自动将空间扩容1.5+倍大小。

扩容操作涉及内存申请和数据搬移,比较耗时,最好事先确定需要存储的数据大小。

数组更适合的场景

1.Java+ArrayList 无法存储基本类型,比如 int、long,需要封装为 Integer、Long 类,而 Autoboxing、Unboxing 则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。

2. 如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。

3. 还有一个是我个人的喜好,当要表示多维数组时,用数组往往会更加直观

 

业务场景用容器,损失点性能无关紧要;

底层架构开发建议用数组

 

练习题目

1.给定一个 1-100 的整数数组,请找到其中缺少的数字。

2.请在给出的整数数组中找到重复的数字。

3.如何在未排序的整数数组中找到最大值与最小值?

4.在给定的成对整数数组中,请找出所有总和等于给定数字的组合。

5.如果数组中有多个重复项,如何找到重复的数字?

6.用 Java 语言实现,在给出的数组中,删除重复项。

7.用 quicksort 算法实现对整数数组的排序。

8.如何删除现有数组中的重复项?

9.用 Java 语言把数组进行反转。

10.如何在不调用库的情况下删除数组中的重复项?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值