内容正文:
专题 16
数组
1
知识梳理
归纳提升
题型考法
考点1 数组的概念与特性
1.数组的概念
(1)数组是由____________的变量构成的一个序列,内存中的存储方式为顺序存储。
(2)数组使用一个标识符命名,并用编号区分数组内的各个变量,这个
特殊的标识符被称为____________,编号称为下标或索引。
(3)数组名和下标组成的各个变量称为数组的分量,也称为数组元素。
相同类型
数组名
知识梳理
归纳提升
题型考法
(4)常用的数组有一维数组和二维数组。
①一维数组:表示具有线性特征的数据序列,只需要一个下标来
表示数据元素在该序列中的位置。
②二维数组:表示二维空间内既有纵向联系又有横向联系的一批
数据,需要两个下标来表示元素的行、列位置信息。
知识梳理
归纳提升
题型考法
2.数组的特性
(1)数组元素的数据类型相同。
(2)通过数组名和下标对数组元素的值进行访问。
(3)存储空间____________。
①即使数组中的某些数据元素已经删除,但其占用的空间会继续
保留。
②数组适用于数据规模可预估且在处理过程中保持稳定的问题。
具有这种特点的数组称为“静态数组”。
③静态数组对应的最大元素数量在数组定义时就已经确定,在程
序运行期间不会发生改变。
固定不变
知识梳理
归纳提升
题型考法
考点2 一维数组的基本操作
1.数组的创建
(1)在系统内存中划分一块连续区域,用来保存数组所含的所有数据
元素。
(2)在 Python 中使用_______来模拟数组,列表的索引可以视为数组的下标。
2.数组元素的访问
通过数组名和下标直接访问数组元素。
3.数组元素的插入
(1)找到需要插入的位置。
(2)将该位置及其之后所有的数据向后移动一个位置。
(3)将新元素插入目标位置,即修改该位置的元素值为新数据。
列表
知识梳理
归纳提升
题型考法
4.数组元素的删除
(1)查找需要删除的元素。
(2)将被删除元素位置后的所有元素依次前移一个位置,即实现删除
元素功能。
(3)数组长度减一。
知识梳理
归纳提升
题型考法
考点3 二维数组的基本操作
1.二维数组的创建(m 行 n 列的二维数组)
(1)可用方式:直接生成或用列表生成式的方法实现。
①直接生成:a=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]。
②列表生成式 :a=[[0 for i in range(n)]for j in range(m)]。
③快速生成一行,然后用列表生成式生成二维数组:a=[[0]*n for i
in range(m)]。
知识梳理
归纳提升
题型考法
(2)不可用方式:一维数组*行数。这种方式会导致当某一行数据被修
改时,其他行的数据也同时会被修改,不利于数据处理的独立性。
如以下两种是错误的创建方式:
①快速生成一行,然后由这一行快速生成若干行:a=[[0]*n]*m。
②列表生成式生成一行,然后快速生成若干行:a=[[0 for i in
range(n)]]*m。
(3)总结:第一步可以用任意一种方式生成一个一维数组(这一步没
有方法限制);第二步由这个一维数组用列表生成式的方法生成
二维数组(这一步不能使用“*”号的浅拷贝方法)。
知识梳理
归纳提升
题型考法
2.二维数组的访问
(1)访问方式:数组名[行下标] [列下标]。注意:不可能有“数组名[列
下标] [行下标]”这样的访问方式。
(2)以元素 a[i][j]为例,访问其周围的元素。
知识梳理
归纳提升
题型考法
判断正误,正确的画“√”,错误的画“×”。
1. 数组在内存中的存储方式是连续的,且大小固定。 ( )
2. 二维数组的邻接元素(如 a[i][j]的上、下、左、右元素)访问时无须考虑边界条件。 ( )
3.数组的插入操作需要先移动元素腾出空间,再插入新数据,这一过程的时间复杂度为 O(1)。( )
4. 删除数组元素时,只需将被删除元素的位置置为 None,无须移动其他元素。 ( )
√
×
×
×
知识梳理
归纳提升
题型考法
(1)数组的创建。
a=[0]*3
#a=[None,None,None]
#创建一个长度为 3 的空数组,None 表示无元素,也可以用 0 占位表示数组为空
(2)数组元素的访问。
a=[1,2,3]
print(a[2]) #访问数组 a 中下标为 2 的元素,输出结果为 3
知识梳理
题型考法
归纳提升
(3)数组元素的插入。
#在数组 a 中插入元素 4,保持数组升序
#None 表示未被利用的数组存储空间
a=[1,3,5,7,None,None]
#首先确定元素 4 插入的位置,元素 5 和 7 应向后移动一位,4 插入到原来 5 所在的位置
a[4]=a[3] #元素 7 后移
a[3]=a[2] #元素 5 后移
a[2]=4 #插入新元素 4
#最终数组 a 的值为[1,3,4,5,7,None],长度加 1,存储空间不变
知识梳理
题型考法
归纳提升
(4)数组元素的删除。
#在该数组中删除元素 3
#None 表示未被利用的数组存储空间
a=[1,2,3,4,5,None,None]
#首先确定被删除元素 3 所在的位置,3 被删除后,元素 4 和 5 应前移一位
a[2]=a[3] #元素 4 前移
a[3]=a[4] #元素 5 前移
a[4]=a[5] #剩余为空位
#最终数组 a 的值为[1,2,4,5,None,None,None],长度减 1,存储空间不变
知识梳理
题型考法
归纳提升
(1)数组的创建。
a=[] #创建一个空数组,长度为 0
(2)数组元素的访问。
a=[1,2,3]
print(a[1]) #访问数组 a 中下标为 1 的元素,输出结果为 2
(3)数组元素的插入。
#动态数组的存储空间可随着数组元素的操作而变化
#在数组 a 中插入元素 6,保持数组升序
a=[1,3,5,7]
a.insert(3,6) #在数组 a 中下标为 3 的位置处插入元素 6
#最终数组 a 的值为[1,3,5,6,7],数组长度及占用的存储空间加 1
知识梳理
题型考法
归纳提升
(4)数组元素的删除。
#在数组 a 中删除元素 4
a=[1,2,3,4,5]
a.pop(3) #删除数组 a 中下标为 3 的数据元素 4
#最终数组 a 的值为[1,2,3,5],数组长度及占用的存储空间减 1
(5)列表模拟实现的动态数组,其数组元素的添加、删除等操作由相应的函数实现。
知识梳理
题型考法
归纳提升
考向 一 数组的概念
例 1 一维数组 a(下标从 0 开始)中的元素值依次为 2~100 之间的偶数,则数组元素 a[k]的值为( )
A.k
B.k+1
C.2*k+1
D.2*k+2
D
例 1 D 一维数组 a的值依次为 a[0]=2、a[1]=4、a[2]=6……通过分析可知当下标为 k时,其值为 2*k+2或 2*(k+1)。
√
知识梳理
归纳提升
题型考法
考向 二 数组的 Python 实现
例 2 [2025浙江9+1联盟]有如下Python程序段:
import random
a=[7,10,5,7,5,6,2,9]
t=0
k=random.randint(1,len(a)-1)
for i in range(len(a)-1,k,-1):
if a[i]>=a[i-2]:
a[i],a[i-2]=a[i-2],a[i]
t+=1
执行该程序段后,变量 t的值有 ( )
A.1 种 B.2 种 C.3 种 D.4 种
D
例 2 D 已知 k 是[1,7]范围内的整数,for 循环遍历数
组a,当a[i]>=a[i-2]时,将其进行交换,变量t的值累加1。所以变量 t 为数据交换的次数,当 k 为 1、2、3 时,t的值是 3;当 k为 4时,t的值是 2;当 k为 5、6时,t的值是1;当k为7时,t的值是0。故变量t的值有4种。
√
知识梳理
归纳提升
题型考法
例 3 [2024 浙江选考]数组元素 a[0]至 a[n-1]依次存放着 n 个数据,现需要将元素 a[n-1]插入在下标为 x(0≤x<n-1)的位置,例如:n 为 5,数组 a为 [0,3,4,6,7],x 为 2,插入操作后 a 为[0,3,7,4,6]。实现该功能的程序段如下,方框中应填入的正确代码为 ( )
temp=a[n-1]
for i in range(n-2,x-1,-1):
a[x]=temp
A.a[i+1]=a[i] B.a[i-1]=a[i]
C.a[i]=a[i+1] D.a[i]=a[i-1]
A
例 3 A 从给定的代码中,数组的元素在插入操作中
会向后移动一位。例如,把最后一个元素(a[n-1])插入到下标为 x 的位置,那么原本在 a[x]的元素值会赋给 a[x+1],原本在 a[x+1]的元素值会赋给 a[x+2],以此类推。故方框处需要将 a[x]及其后面的所有元素都向后移动一位,即将a[i]的值赋给a[i+1]。
√
知识梳理
归纳提升
题型考法
例 4 [2025山海协作联盟]有如下Python程序段:
from random import randint
a=[0]*6;flag=True;i=0
while i<6:
x=randint(10,100)
if not flag or x<50:
a[i]=x
flag=not flag
i+=1
执行该程序段后,列表 a 的值可能是 ( )
A.[34,73,8,98,10,65] B.[89,53,18,35,20,58]
C.[12,86,29,45,16,61] D.[38,28,11,94,63,77]
C
例 4 C while 循环一共执行 6 次,在每次循环中,产生一个[10,100]范围内的随机整数 x,若 flag 的值为 False 或 x小于 50,则将 a[i]赋值为 x,接着将 flag 取反,i 的值递增1,继续下一轮循环。选项 A,a[2]为 8,不在取值范围内。选项 B,a[0]的值一定小于 50,故不可能。选项 D,根据程序可知,第四轮循环执行完后,flag 的值为 True,所以 a[4]的值一定小于 50,故不可能。
√
知识梳理
归纳提升
题型考法
例 5 [2025 浙江 A9 协作体]用数组模拟区间合并:数组 d 中存放 n 个区间的起点和终点,例如 d=[1,5,2,3,3,8,10,12],其中第一个区间为[1,5],第二个区间为[2,3]……且区间已按起点升序排列,对这 n 个区间进行合并操作并输出最终结果。例如[1,5]和[2,3]的合并结果为[1,5],对剩余数据继续进行合并,最终输出合并结果为[1,8]和[10,12]。实现上述功能的 Python 程序如下,划线处应填入的正确代码为 ( )
lt,rt=0,1
for i in range(2,len(d),2):
if ① :
if d[i+1]>d[rt]:
rt=i+1
else:
print(d[lt],d[rt]) #输出区间
lt= ②
rt=lt+1
print(d[lt],d[rt])
A.①d[i]>=d[rt] ②i B.①d[i]>=d[lt] ②i+1
C.①d[i]<=d[rt] ②i D.①d[i]<=d[lt] ②i+1
C
例 5 C 变量 i 的取值为 2,4,6,若 d[i]<=d[rt]且 d[i+1]>d[rt],则对这两个区间进行合并,区间终点更新为 i+1;若d[i]>d[rt],则不能合并,输出区间,lt更新为 i,rt更新为 lt+1。
√
知识梳理
归纳提升
题型考法
考向 三 二维数组
例 6 有如下 Python 程序段:
a=[[1,3,6,9],[2,4,7,5],[5,2,3,8]]
b=[1];n=len(a)
for i in range(n):
for j in range(n+1):
if i<j and a[i][j] not in b:
b.append(a[i][j])
执行该程序段后,数组 b 中的元素是 ( )
A.[1,3,6,9,7,5,8] B.[3,6,9,7,5,8]
C.[1,3,6,9,2,4,7,5,8] D.[1,3,6,9,4,7,5,8]
A
例 6 A 该程序段的功能是将二维数组 a 中行下标 i 小于列下标 j 的元素加入数组 b 中,且数组 b 中的元素不重复。故数组 b 中的元素为[1,3,6,9,7,5,8]。
√
知识梳理
归纳提升
题型考法
例 7 [2025 丽水联考]某加密程序的功能如下:输入原文,输出加密后的密文。原文信息仅包含大写字母,个数不超过 n*n(n 为密钥矩阵规模),加密过程如下:
●每个字母得到一个编码值和一个位置值。编码值为该字母在 26 个字母中的位置,例如"A"的编码值为 1,"H"的编码值为 8;位置值为该字母在原文中的位置,例如"HAPPY"中"H"的位置值为 1,"A"的位置值为 2。原文"HAPPY"的编码值及位置值如图 a 所示。
●将原文的编码值和位置值依次存入二维数组 b中。例如,原文"HAPPY"生成的数组 b 为[[8,1],[1,2],[16,3],[16,4],[25,5]]。
●随机生成一个密钥不重复的矩阵(密钥范围在1~n*n 之间)。例如 n=3,随机生成的密钥矩阵如图 b 所示。
知识梳理
归纳提升
题型考法
●加密值=编码值+位置密钥值,其中位置密钥值是在密钥矩阵中按箭头方向(蛇形走位)根据位置值取值。例如"Y"在原文中的位置为 5,其位置密钥值为 6,加密值为 25+6=31。 原 文"HAPPY"的加密值如图 c 所示。
●将所有加密值和位置值按顺序排列,得到密文。
例如"HAPPY"的密文为[10,1,6,2,23,3,17,4,31,5]。
知识梳理
归纳提升
题型考法
(1)假设随机的密钥矩阵如图 b 所示,若原文为"BC",则加密后的密文是 。
(2)实现加密算法的 Python 程序如下,程序运行界面如图 d所示,请在划线处填入合适的代码。
[4,1,8,2]
知识梳理
归纳提升
题型考法
def myjz(x): #获取位置值为 x 的位置密钥值
row=(x-1)//n;col=(x-1)%n
if row%2==1:
col= ①
return a[row][col]
import random
p=input("请输入明文:")
#数组 b 存储原文的编码值及位置值
b=[[0 for j in range(2)] for i in range(len(p))]
for i in range(len(p)):
for j in range(2):
if j==0:
②
else:
b[i][j]=i+1
n=int(input("请输入密钥矩阵规模 n:"))
flag=[False]*(n*n+1)
a=[[0 for i in range(n)] for j in range(n)]
i=0
n-col-1
'''生成 1~n*n 范围内的不重复密钥矩阵,存入
二维数组 a 中'''
while i<n:
j=0
while j<n:
a[i][j]=random.randint(1,n*n)
if flag[a[i][j]]==False:
③
j+=1
i+=1
print("生成的密钥矩阵为:")
for i in range(n):
print(a[i])
mw=[];jmz=0
for i in range(len(p)): #生成密文 mw
④
mw.append(jmz);mw.append(i+1)
print("生成的密文为:")
print(mw)
b[i][j]=ord(p[i])-64
flag[a[i][j]]=True
jmz=b[i][0]+myjz(i+1)
知识梳理
归纳提升
题型考法
例 7 (1)[4,1,8,2] (2)①n-col-1 ②b[i][j]=ord(p[i])-64
③flag[a[i][j]]=True ④jmz=b[i][0]+myjz(i+1)
(1)"B"的编码值为 2,位置值为 1,位置密钥值为 2,加密值为 2+2=4;"C"的编码值为 3,位置值为 2,位置密钥值为 5,加 密 值 为 3+5=8,故 加 密 后 的 密 文 是 [4, 1, 8, 2]。(2)①若是奇数行,则取值应从后往前,故填入代码为 n_x0002_co-1。②在数组 b 中,第一位是编码值,第二位是位置值,代码“j==0”表明要存储编码值,故填入代码为 b[i][j]=ord(p[i])-64。③flag 用来标记数字是否已经生成过,若之前没生成过,则把标记置为真,故填入代码为 flag[a[i][j]]=True。④已知加密值=编码值+位置密钥值,故填入代码为 jmz=b[i][0]+myjz(i+1)。
知识梳理
归纳提升
题型考法
THANK YOU
$$