数组——基本知识点和常考面试题

一、初始化的问题知识点:

1、c++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。
2、一维数组的初始化:

二维数组的初始化:

【问题1】自己的面试题:

题1:int id[sizeof(unsigned long)]; 语句的写法是否正确:()

解析:正确,实践是验证真理的唯一标准,下面是自己编写的程序。因为这里sizeof(unsigned long)=4 是常量。

#include<iostream>
using namespace std;

void main()

{
	int id[sizeof(unsigned long)];
	id[0] = 1;
	printf("i[0]=%d",id[0]);
	return 0;
	}
题2: 不知道为什么下面的程序能通过?
#include<iostream>
using namespace std;
void main()
{
	int a[3];
	a[5] = 1;
	printf("a[5]=%d\n", a[5]);

	return;
}

二、数组和链表的区别(数组和链表的优缺点 & 数组和链表的适用场景)

参考:
https://blog.csdn.net/dangzhangjing97/article/details/81699050
https://blog.csdn.net/qq_35044419/article/details/88580775

1、数组和链表的区别?

不同点(大概有四点):
(1)链表是链式的存储结构;数组是顺序的存储结构。

(2)链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。

(3)链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;

(4)数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。

相同点:
(1)两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。

2、数组和链表的特点和优缺点

数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点

数组
一、数组的特点
1.在内存中,数组是一块连续的区域
2.数组需要预留空间

在使用前需要提前申请所占内存的大小,这样不知道需要多大的空间,就预先申请可能会浪费内存空间,即数组空间利用率低
ps:数组的空间在编译阶段就需要进行确定,所以需要提前给出数组空间的大小(在运行阶段是不允许改变的)

3.在数组起始位置处,插入数据和删除数据效率低。

插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移
删除数据时,待删除位置后面的所有元素都需要向前搬移

4.随机访问效率很高,时间复杂度可以达到O(1)

因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址处向后偏移就可以访问到了

5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及到需要把旧数组中的所有元素向新数组中搬移
6.数组的空间是从栈分配的

二、数组的优点
随机访问性强,查找速度快,时间复杂度为O(1)

三、数组的缺点
1.头插和头删的效率低,时间复杂度为O(N)
2.空间利用率不高
3.内存空间要求高,必须有足够的连续的内存空间
4.数组空间的大小固定,不能动态拓展

链表
一、链表的特点
1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续
2.链表中的元素都会两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址

每一个数据都会保存下一个数据的内存的地址,通过此地址可以找到下一个数据

3.查找数据时效率低,时间复杂度为O(N)

因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)

4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高
5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
6.链表的空间是从堆中分配的

二、链表的优点
1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
2.内存利用率高,不会浪费内存
3.链表的空间大小不固定,可以动态拓展

三、链表的缺点
随机访问效率低,时间复杂度为0(N)
在这里插入图片描述

3、数组和链表的适用场景

综上:

对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组
对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值