内容正文:
第二章 数据与链表
一、选择题
1.有Python程序段如下:
#链表1st中的每个元素由数据和指针两个数据项组成,其中数据可能重复且呈升序排列
p1=head
p2=lst[pl][1]
while p2!=-1:
if 1st[p1][0]==1st[p2][0]:
p2=1st[p2][1]
1st[p1][1]=p2
else:
p1=p2
p2=1st[p2][1]
若链表1st的初始状态为,则执行完该程序段后链表1st更新为( )
A. B.
C. D.
2.使用列表d模拟链表结构(节点数大于0),每个节点包含数据区域和指针区域,h为头指针。下列程序段实现了删除数据区域为奇数的节点。
q=p=h=2
while p!=-1:
if d[h][0]%2==1:
(1)
q=p=h
elif d[p][0]%2==1:
(2)
p=d[p][1]
else:
q=p
p=d[p][1]
划线处可选代码如下:
①h=d[h][1] ②p=d[p][1] ③d[p][1]=d[q][1] ④d[q][1]=d[p][1]
下列选项中,代码顺序正确的是( )
A.①③ B.②③ C.①④ D.②④
3.下列关于链表节点插入操作的描述,哪个是正确的( )
A.插入操作总是从链表头部开始
B.只需要修改新节点的指针域即可完成插入
C.必须先找到插入位置的前驱节点,再修改前驱节点的指针域
D.链表插入操作的时间复杂度总是O(1)
4.在一个列表a中隐藏着一个链表,a=[[4,0],[5,2],[7,4],[8,5],[6,3],[1,-1]]。链表节点a[i]中,a[i][0]表示数据,a[i][1]表示指针,下列说法正确的是( )
A.链表的两个相邻节点,其存储空间必须连续 B.该隐藏链表的表头head=2
C.该隐藏链表有5个节点 D.代码“a[i][1]=a[i+1][1]”可以实现删除节点“i+1”
5.关于线性链表的描述,以下选项中正确的是( )
A.存储空间不一定连续,且各元素的存储顺序是任意的
B.存储空间必须连续,且各元素的存储顺序是任意的
C.存储空间不一定连续,且前件元素一定存储在后件元素的前面
D.存储空间必须连续,且前件元素一定存储在后件元素的前面
6.数组元素 a[0]至a[n-1]依次存放着n个数据,其中前 n-1个数据不重复且有序,现需要将x(与前 n-1个数据不重复) 插入到数组中,使数组仍然有序。例如: n为5,数组 a为[0,5,10,20,20] , x为8,插入操作后 a为[0,5,8,10,20]。实现该功能的程序段如下:
i=0
while i<n-1 and a[i]<x:
i+=1
for k in range( a[k]= a[k-1]
a[i]=x
方框中应填入的正确代码为( )
A.n,i,-1 B.n-1,i,-1 C.i+1,n D.i-1,n-1
7.下列Python程序段的功能是在链表link1中删除数据为key的所有节点,link1链表中的每个节点由一个数据域和一个指针域组成。
#建立链表 link1,代码略
key=int(input("输入要删除的数据:"))
head=0
while link1[head][0]==key and head!=- 1:
head=link1[head][1]
p=q=head
if head==- 1:
print("全部数据删除")
else:
q=link1[q][1]
while ① :
if link1[q][0]==key:
②
else:
p=link1[p][1]
q=link1[q][1]
则划线①②处的代码分别为( )
A.①link1[q][1]!=- 1 ②link1[p][1]=link1[q][1]
B.①link1[q][1]!=- 1 ②link1[q][1]=link1[p][1]
C.①q!=- 1 ②link1[q][1]=link1[p][1]
D.①q!=- 1 ②link1[p][1]=link1[q][1]
8.使用列表模拟单向链表,链表中p节点的a[p][0]存储数据,a[p][1]存储其后继节点的指针。编写Python程序删除链表中所有的偶数项(头节点为该链表的第1项),部分代码如下:
p=head #head指向该链表的头节点
while p!=-1:
q=a[p][1] if (1) :
(2)
p=a[p][1]
上述程序段划线处可选语句为
①q!=-1 ②a[q][1]!=-1 ③a[q][1]=a[p][1] ④a[p][1]=a[q][1]
则(1)(2)处填入的语句依次为( )
A.①③ B.①④ C.②③ D.②④
9.有如下 Python 程序段
def bianli(head):
pt = head
while pt != -1:
print(data[pt][0],data[pt][1],"->",end='')
pt = data[pt][1]
print()
data = [['A',1],['B',2],['C',3],['D',-1]]
head = 0
bianli(head) #遍历链表,显示初始状态为“A 1 ->B 2 ->C 3 ->D -1 ->”
qt = head
pt = data[qt][1]
bianli(head) #遍历链表,显示最终状态为“A 2 ->C 1 ->B 3 ->D -1 ->”
执行该程序段后,链表遍历结果由初始状态变为最终状态,上述程序段中方框处可选代码为:
①data[data[qt][1]][1] = pt
②data[qt][1] = data[pt][1]
③data[pt][1] = data[data[pt][1]][1]
则方框处代码的正确顺序是( )
A.①②③ B.①③② C.②①③ D.②③①
10.有一组含有9个元素的有序链表:1->3->5->6->8->11->15->18->20,现为该链表增设关键节点,建立索引,下列说法不正确的是( )
A.一级索引中的关键节点为1,5,8,15,20
B.二级索引中的关键节点为1,8,20
C.若要在建立的一级索引的基础上插入元素7,则需要比较3次即可找到7插入的位置
D.若要在建立的二级索引的基础上查找元素18,则需要比较4次就可以找到元素18
11.有关数组特征描述中,下列说法不正确的是( )
A.同一数组中,每个数组元素的数据类型是相同的
B.通过数组名和下标可以对数组中任意位置的数组元素进行高效访问
C.数组的存储空间固定不变
D.数组是非顺序存储结构
12.将英文单词“student”中的每个字符按次序以单链表的形式进行存储,操作过程中漏掉了字符 e,存储状态如图所示:
现将字符e存放于1111H处,并按正确的次序插入单链表中,则元素d、e、n的“链接地址”依次是( )
A.100CH,1014H,1111H B.100CH,1111H,1014H
C.1111H,100CH,1014H D.1111H,1014H,100CH
13.设有数组定义语句:Dim a(5) As Integer,Listl 为列表框控件。下列给数组元素赋值的语句,错误的是( )。
A.a(3)=3
B.a(3)=VAL(InputBox(“InputData”)
C.a(3)=Listl.ListIndex
D.a=Array(1,2,3,4,5,6)
14.下列说法或用法正确的是( )
A.OPTION BASE 6
B.OPTION BASE 语句的位置可以任意
C.DIM A(6,3 TO 7)定义的是二维数组
D.数组元素的下标不能是负数。
二、填空题
15.用二维数组表示的数据在内存中的存储方式也采用顺序存储,有 和 两种方式。
16.在数据结构中, 是一种允许在任何位置插入和删除元素的数据结构。
17.数组 d 的初始值如表所示,则 d(d(3))+d(4)的值 ( )。
18.在程序运行过程中可以改变数组元素个数的是( )数组,不可以改变数组元素个数的是( )数组。
三、操作题
19.程序运行时,以内存单元为基本单位对内存进行分配,若干个连续的内存单元称为一个内存块,每个内存块的信息包含首地址和大小,编写Python程序模拟内存分配和释放的过程。
1)初始化空间内存块,将信息存储在链表flink中。
2)分配大小为size的内存,先依次查找结束think中是否存在不小于size的内存块,若存在且等于size,则将其从链表flink中删除,若存在且大于size,则修改该内存块的信息;若不存在,则对不连续的空间内存块按顺序进行分配,如果空间内存块之和仍小于size,则分配失败。
3)释放内存。将释放的内存块信息插入链表flink,链表flink各节点按前地址从小到大排列。如果释放的内存块与链表中的某个内存块相邻,则将它们合并成一个更大的内存块。
请回答下列问题:
(1)初始空间内存块大小为16,进行两次分配和一次释放的过程如下图所示。若继续分配大小为8的内存换, (填写,能/不能)成功。
①初始化空间内存块,大小为16
②第1次分配,大小为4,分配后空闲12
③第2次分配,大小为1,分配后空闲4
④释放第1次分配的内存,释放后空闲8(不连续)
(2)定义如下allocate (flink,head,size)函数,参数flink是空闲内存块链表,head是flink头指针,size为所需内存块大小,函数功能为分配size大小的空间内存块,并返回分配的内存块信息及头指针head,请在划线处填入合适的代码。
def allocate(flink, head, size):
block =[]
pre = head;cur = head
while cur !=-1:
if flink[cur][1]>= size:
break
pre = cur
cur = flink[cur][2]
if cur!=-1 and flink[cur][1]== size:
block.append([flink[cur][0],size])
if pre == cur:
①
else:
flink[pre][2] = flink[cur][2]
elif cur!=-1 and flink[cur][1]> size:
block.append([flink[cur][0],size])
flink[cur][0]=flink[cur][0]+size
②
if len(block)==0:
#对不连续的空闲内存块按顺序进行分配,如果空闲内存块之和仍小于size,则分配失败,
#代码省略
return block,head
(3)实现模拟过程及内存释放的部分Python程序如下,请在划线处填入合适的代码.
def release(flink, head, block):
for i in range(len(block)):
if head==-1:
flink.append([block[i][0],block[i][1],-1])
head=len(flink)-1
else:
pre = head
cur = head
while cur !=-1:
if flink[cur][0] > block[i][0]:
break
pre=cur
cur =flink[cur][2]
flink.append([block[i][0],block[i][1],cur])
if cur==head:
pre=len(flink)-1
head=len(flink)-1
else:
①
cur = flink[pre][2]
#合并相邻空闲块
while cur!=-1:
if flink[pre][0]+flink[pre][1]==flink[cur][0]:
②
flink[pre][2]=flink[cur][2]
cur =flink[cur][2]
continue
pre = cur
cur =flink[cur][2]
return [[-1,-1,-1]],head
flink= [[0,16,-1]]
#初始化空闲内存块链表,0:起始地址,16:长度
head=0
block1,head = allocate(flink ,head, 4)
block2,head = allocate(flink, head, 8)
block1,head = release(flink,head,block1)
20.某工程包含n个任务(编号为0-n-1),每天可以有多个任务同时进行。某些任务之间有依赖关系,如图a所示,任务4依赖于任务1,任务1依赖于任务2。即任务2完成后才可以开始任务1,任务1完成后才可以开始任务4,不存在一个任务依赖于多个任务,或多个任务依赖于同一个任务的情况。
现已对该工程的依赖关系进行了梳理,结果如图b所示,标记“T”表示依赖关系需保留,标记“F”表示依赖关系需删除。
根据每个任务完成所需的天数和梳理后的依赖关系,编写程序,首先删除标记为“F”的依赖关系,然后计算工程最快完成所需的天数,并以工程最快完成所需的天数为期限,计算每个任务最晚必须开始的时间。
图a 图b
请回答下列问题:
(1)若某工程有6个任务,任务间依赖关系如图a所示,完成任务0~5所需天数分别为2,1,3,5,1,6,则工程最快完成需要 天。
(2)定义如下erase(1st)函数,参数1st列表的每个元素表示一个依赖关系。函数的功能是删除标记为“F”的依赖关系,返回保留的依赖关系的个数。
def erase(lst):
i=0
j=len(1st)-1
while i<=j:
if 1st[i][2]=='T':
i+=1
else:
if lst[j][2]=='T':
1st[i]=1st[j]
i+=1
j-=1
return i
若1st列表依次存储图b所示的依赖关系,如1st[0]为[0,5,T],调用erase(lst)的数,则语句
"1st[i]=1st[j]”的执行次数为 。
(3)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
def proc(n,lst,task):
pr=[0]*n
w=[0]*n #w[i]存放任务1最晚必须开始的时间
m=erase(1st)
for i in① :
task[lst[i][1]][1]=1st[i][0]
pr[lst[i][0]]=1
c=[]
days=0 #days存放工程最快完成所需的天数
for I in range(n):
if pr[i]==0:
k=i
s=0
while k!=-1:
c.append(k)
s+=task[k][0]
②
if s>days:
days=s
for i in range(n-1,-1,-1):
k=c[i]
if task[k][1]==-1:
w[k]=days-task[k][0]+1
else:
③
#输出days,以及保存在w中的每个任务最晚必须开始的时间,代码略
```
工程包含的任务数存入变量n
任务间的依赖关系存入1st列表
1st[0]包含3项,任务1st[i][0]依赖于任务1st[i][1],1st[i][2]存放保留/删除标记,任务数据存入task列表
task[i]包含2项,task[i][0]为完成任务主所需天数,task[i][1]的初值为-1
代码略
```
proc(n,1st,task)
21.某信息仅包含大写字母,字符数不超过n*n(n*n为密钥矩阵规模,n>0),加密过程如图a所示:
图a
图b
(1)已知密钥矩阵按图a中所示,若原文为“OK”,则加密后的密文是 ,若输入的密文是“10,1,24,2,”,则原文是 。
(2)根据上述加密算法编写解密程序,运行界面如图c所示。请在划线①②③处填上合适的代码。
图c
def getmm(x,n): #获取位置编号x的位置密钥值
row=(x-1)%n
col=(x-1)//n
if① :
row=n-1-row
return key[row][col]
#生成规模为n*n的密钥矩阵,存入二维矩阵key中
n=int(input("请输入密钥矩阵规模n:"))
key=[[i*n+j+l for j in range(n)] for i in range(n)]
#密文解密
p=input("请输入密文: ")
mw=[]
bmz=[]
t=0
for i in range (1en(p)):
#依次读取密文字符串中的数值,结果存入到列表mw中
s=p[i]
if s!=",":
.②
else:
mw. append (t)
t=0
k=len (mw)
for i in range(k//2) : #对密文解密,结果存入列表bmz中
bmz. append (mw [2*i]- ③
yw="
for i in range (k//2): #转换为字母输出
yw=ywtchr (bmz [i]-1+ord("A"))
print("原文为:"+yw)
试卷第1页,共3页
试卷第1页,共3页
学科网(北京)股份有限公司
参考答案:
1.A
【详解】本题考查链表。
该程序功能为,去除链表中的重复数据。通过观察链表图,可知选项A为去除重复。故正确答案为:选项A。
2.C
【详解】本题考查程序分析。(1)当头节点为奇数时,需要更新头节点。则移动头节点。故h=d[h][1]。(2)当p节点为奇数时候,需要删除该节点,将p的后继节点接到p的前驱结点q的下一个节点指针上。故d[q][1]=d[p][1]。故正确答案为选项C。
3.C
【详解】本题考查链表。必须先找到插入位置的前驱节点,再修改前驱节点的指针域,C该选项描述了链表插入操作的正确步骤,需要先定位到插入位置的前驱节点,然后修改其指针指向新节点。故答案为:C。
4.C
【详解】本题考查链表。A选项错误,链表的相邻节点存储时不需要连续空间。B选项错误,该隐藏链表的表头head=1。D选项错误,删除节点“i+1”的代码是“a[i][1]=a[a[i][1]][1]”。故答案为:C。
5.A
【详解】本题考查线性链表。具有链接存储结构的线性表,它用一组地址任意的存储单元存放线性表中的数据元素,逻辑上相邻的元素在物理上不要求也相邻。选项A正确,其它选项错误。故正确答案为选项A。
6.B
【详解】本题考查的是Python数组操作。插入元素需要数组后移操作,且先移最后一个元素,第一次移动a[n-2]到n-1位置,所以开始值为:n-1,选项B正确。
7.D
【详解】本题主要考查链表的操作。通过遍历链表来寻找key,故第一空while循环条件是q!=-1。如果link1[q][0]==key,则删除key所在的节点,p是q的上一个节点,则通过p的指针域指向q的指针域以实现删除q节点,故第二空填link1[p][1]=link1[q][1],故本题选D选项。
8.B
【详解】本题主要考查链表数据结构及Python程序实现。头节点为该链表的第1项,p的初值指向head,q为p的下一个节点,因此每次删除q节点即可,删除之前需要判断q是否为-1,故if判断条件是q!=-1,删除q节点的方法是,p的后继节点指向q的后继节点,即a[p][1]=a[q][1],选项B符合题意,故选B。
9.D
【详解】本题主要考查链表及其Python程序实现。本程序考查的是链表的重新链接,程序实现的效果是 A 1 ->B 2 ->C 3 ->D -1 ->,变为 A 2->C 1 ->B 3 ->D -1 ->,qt 指前一指针,pt 指后一指针,故‘A’要指向‘C’,‘B’要指向‘D’,然后‘C’要指向‘B’,即正确的顺序是,故本题选D选项。
10.C
【详解】本题主要考查链表数据结构。有序链表:1->3->5->6->8->11->15->18->20,则一级索引中的关键节点为1,5,8,15,20(取奇数位);二级索引中的关键节点为1,8,20(取首尾以及中间元素);若要在建立的一级索引的基础上插入元素7,则需要比较4次即可找到7插入的位置,首先分别与1、5、8比较,其次与6比较共4次;若要在建立的二级索引的基础上查找元素18,则需要比较4次就可以找到元素18,分别与8、20比较,再与19、18比较,共4次,故本题选C选项。
11.D
【详解】本题主要考查数组特征。同一数组中,每个数组元素的数据类型是相同的;通过数组名和下标可以对数组中任意位置的数组元素进行高效访问;数组的存储空间固定不变;数组是顺序存储结构,故本题选D选项。
12.C
【详解】本题考查的是链表的读取。将字母e插入后,其链接地址如下图:
故,d、e、n的“链接地址”依次是111H、100CH、1014H。选项C正确。
13.D
【详解】本题主要考查数组的赋值。array()函数的作用:返回一个包含数组的Variant(可变的),题干定义了一个容量固定的数组a(Dim a(5) As Integer),故赋值语句a=Array(1,2,3,4,5,6)是错误的,故本题选D选项。
14.C
【详解】本题考查的是VB数据定义。option base在模块级别中使用,用来声明数组下标的缺省下界,option base后面只能是0或者1,由于默认是0,所以是0的时候可以不用option,因此A、B选项错误;DIM A(6,3 TO 7)定义的是一个35个元素的二维数组,因此C选项正确;数组下标可以是负数,系统只算区间的个数,因此D选项错误。
15. 行优先存储 列优先存储
【详解】本题考查数组。
用二维数组表示的数据在内存中的存储方式也采用顺序存储,主要有行优先顺序(也称为行主序)和列优先顺序(也称为列主序)两种方式。
行优先顺序(Row-major order):在这种方式中,二维数组被视为一组连续的行,每行中的元素连续存储。即,先存储第一行的所有元素,然后是第二行的所有元素,依此类推,直到最后一行。这是大多数编程语言(如C、C++、Java等)中二维数组的默认存储方式。
列优先顺序(Column-major order):在这种方式中,二维数组被视为一组连续的列,每列中的元素连续存储。即,先存储第一列的所有元素,然后是第二列的所有元素,依此类推,直到最后一列。虽然这种方式在某些特定的应用场景(如数学和某些科学计算)中更为直观,但在大多数编程语言中,它并不是默认的二维数组存储方式。不过,某些特定的编程语言或库(如Fortran和一些数学计算库)可能会采用列优先顺序来存储二维数组。
16.链表(或LinkedList)
【详解】本题考查链表。在数据结构中,链表(Linked List)是一种允许在任何位置插入和删除元素的数据结构。链表通过节点(Node)的集合来表示数据集合,每个节点都包含数据部分和指向列表中下一个节点的链接(或指针、引用)。由于这种结构不要求在物理上连续存储数据,因此它允许在链表中的任何位置快速插入和删除节点,而不需要像数组那样重新分配整个数据结构的内存。故正确答案为:链表(或LinkedList)。
17.20
【详解】本题主要考查数组。根据题示,d(3)=6,所以 d(d(3));d(4)=8,因此d(d(3))+d(4)=20
【点睛】
18. 动态 静态
【详解】本题主要考查数组的操作。在程序运行过程中可以改变数组元素个数的是动态数组,不可以改变数组元素个数的是静态数组。
19. 能 head = flink[cur][2] flink[cur][1]=flink[cur][1]-size flink[pre][2]=len(flink)-1 flink[pre][1] = flink[pre][1] + flink[cur][1] 或flink[pre][1] += flink[cur][1]
【详解】本题考查Python程序设计相关内容。本题涉及到链表、自定义函数、二维列表等知识点。
(1)若不存在连续的大于等于size的空间则对不连续的空闲内存块进行分配,故①处答案为:能。
(2)若存在且等于size,则将其从链表flink中删除,删除分两种情况,如果是表头,直接修改表头指针,故①处为:head = flink[cur][2];若存在且大于size,则修改该内存块的信息,故②处应为:flink[cur][1]=flink[cur][1]-size;
(3)查找到第一处起始地址大于待释放内存块的节点,并将待释放内存块插入链表pre节点与cur节点之间。若待释放内存块的起始地址大于头节点,则要更改pre节点与cur节点,故①处应为:flink[pre][2]=len(flink)-1;如果释放的内存块与链表中的某个内存块相邻,则将它们合并成一个更大的内存块,故②处应为:flink[pre][1] = flink[pre][1] + flink[cur][1] 或flink[pre][1] += flink[cur][1]。
20. 8 1 range(m) 或range(0,m) 或range(0,m,1) 或range(m-1,-1,-1)或range(erase(1st)) 或range(0,erase(1st)) 或range(0,erase(1st),1) 或range(erase(1st)-1,-1,-1) k=task[k][1] w[k]=w[task[k][1]]-task[k][0] 或w[k]=w[c[i+1]]-task[k][0] 这里面可以把k换成c[i]
【详解】本题考查数组、链表相关操作。(1)依据题干,将所有任务分为三组:[5,0]需要8天、[4,1,2]需要5天、[3]需要5天,三组任务可以同时进行,取最多的天数即为工程最快完成时间。故工程最快完成需要8天。(2)erase(1st)函数用于删除1st列表中标记为删除的任务。该函数遍历lst列表,通过两个指针i和j,分别指向列表的头部和尾部。当1st[i][2]为T时,表示该任务需要保留,指针i向后移动一位。当1st[i][2]不为'T'时,表示该任务需要删除,将1st[i]替换为1st[j],然后指针i向后移动一位,指针j向前移动一位。最后返回指针i的值,即删除后的列表长度,不管尾元素是否标记为“F”,j都向前移动一个位置。结合图b,可知语句“1st[i]=1st[j]”只在i=1,j=3时执行1次。(3)自定义函数proc(n,1st,task),用于处理任务调度。lst中已经删除了标记为“F”的依赖关系,erase(1st)函数返回值为i赋值给了m,正好代表了剩余的元素个数,所以一空应填写range(m)或等价表达式。对于每个删除后的任务1st[i],将1st[i][0]作为任务的编号,将1st[i][1]作为任务的前置任务编号,将1st[i][0]作为任务的主任务编号。并将pr[lst[i][0]]设置为1,表示该任务有前置任务。空列表c,用于存放可以进行的任务序列。变量days用于存放工程最快完成所需的天数。接下来,遍历任务列表,对于每个任务编号i,如果该任务的前置任务编号为0,则将其作为起始任务,进行任务序列完成时间的计算。在计算过程中,将当前任务编号k添加到列表c中,累加任务的完成时间s,并将当前任务的主任务编号task[k][1]作为下一个任务的前置任务编号k,所以第二空的答案为k=task[k][1]。最后,如果累加完成时间s大于days,则更新days的值。接下来,通过倒序遍历任务列表,计算每个任务的最晚开始时间。对于每个任务编号k,如果该任务没有后续任务(即task[k][1]为-1),则将最晚开始时间w[k]设置为days-task[k][0]+1,表示该任务必须在工程最快完成时间内开始。否则,将最晚开始时间w[k]设置为其后续任务的最晚开始时间减去当前任务完成时间,表示该任务必须在其后续任务完成前开始。所以第三空的答案为w[k]=w[task[k][1]]-task[k][0]。
21. 16,1,15,2, IT col%2==1 或其他等价答案 t=t*10+int(s) 或其他等价答案 getmm(mw[2*i+1],n)
【详解】本题考查的是数组的综合应用。O的编码值为15,位置编号1,其秘钥值1,加密值为15+1=16;K的编码值为11,位置编号2,其秘钥值4,加密值为11+4=15,故若原文为“OK”,则加密后的密文是16,1,15,2,;若输入的密文是“10,1,24,2,”,则第一位的编码值为:10-1=9对应字母为I,第二位的编码值为:24-4=20对应字母为T,故原文是:IT。(2)row表示行号,col表示列号,依据秘钥矩阵图,当列号为奇数时,从下往上访问,故第一空应为:col%2==1 或其他等价答案;读取的字符不为“,”则拼接到数字t后,故第二空为:t=t*10+int(s) 或其他等价答案;列表索引从0开始,故索引号为偶数里存放的是加密值,奇数存放的是位置编号,依据加密原理倒推,可知编码值=加密值-秘钥值。函数getmm(x,n)是获取位置编号x的位置密钥值,故第三空应为:getmm(mw[2*i+1],n)。
答案第1页,共2页
答案第1页,共2页
学科网(北京)股份有限公司
$$