2026届高中信息技术二轮专题复习 4.5 数组 学案(含解析)

资源下载
  1. 二一教育资源

2026届高中信息技术二轮专题复习 4.5 数组 学案(含解析)

资源简介

4.5 数 组
学习目标 
1.知道数组的概念和特性,能够辨别程序设计中数据的组织形式,领会数据结构对数据处理的重要性。
2.针对生活中简单的实际问题,根据数据及其关系特征,选择数组组织、存储数据,编写程序实现相关操作,并能迁移到与之相关的其他问题解决中。
(2024年1月浙江选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=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]
  数组是典型的顺序存储结构,是将逻辑上相邻的数据节点存储在物理位置相邻的存储单元中,最大特点是可以通过下标来直接访问某个数组元素,因此访问数组元素较快。若要删除数组中间位置某个元素,必须将该元素后面的元素一个个往前移动,若在中间位置前插入一个新元素,必须将其后面的元素一个个往后移动,因此插入或删除元素的效率较低。
m行n列的二维数组可以看成有n个一维数组共享m个下标的集合,在数据加工处理时,效率会比一维数组高。在处理二维数组的题目时,先要画出二维数组的结构,理解每个数组元素的含义,理解如何定位到某个数据项。
例1 数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值加1,并保持数组的有序性不变,实现该功能的程序段如下,划线处应填入的正确代码为(  )
t=a[pos]+1
i=pos
while       :
  a[i]=a[i+1]
  i+=1
a[i]=t
A.iB.ia[i+1]
C.ia[i+1]
D.i<=n-1 or t>a[i]
变式1 数组元素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  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
例2 (2025年1月浙江选考)列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为10以内的随机正整数。执行如下程序段,输出的最后一行是(  )
i 0 1 2 3 4 5 6 7 8 9 …… 90 91 92 93 94 95 96 97 98 99
c[i] 1 1 1 1 2 3 2 3 2 3 …… 2 3 2 2 2 2 1 1 1 1
pa=[0,0,0,0,0]
pb=[0,0,0,0,0]
h,t=0,4
tmp=0
for k in range(100):
  pa[t]=c[k]
  pb[t]=tmp+pa[t]-pa[h]
  print(pb[h],pb[t],k,pa,pb,h,t)
  tmp=pb[t]
  h=(h+1) % 5
  t=(t+1) % 5
                               
A.5 4 B.8 4
C.9 5 D.9 9
变式2 列表lst长度为20,如下表所示,其中lst[5]~lst[15]各元素的值均为小于等于0的随机整数。执行如下程序段,输出结果是(  )
i 0 1 2 3 4 …… 16 17 18 19
lst[i] 2 -3 9 1 2 …… -2 0 -6 5
n=len(lst);p=lst[0]
for i in range(0,n):
  tmps=0
  j=i
  while (j+1)%n!=i:
    tmps+=lst[j]
    if tmps>p:
      p=tmps
    j=(j+1)%n
print(p)
A.10 B.12
C.16 D.19
1.有如下Python程序段:
#随机产生5个整数,存储在列表a中
for i in range(1,5):
  k=a[i]
  j=i-1
  while j>=0 and abs(a[j]-2)>abs(k-2):
    a[j+1]=a[j]
    j-=1
  a[j+1]=k
执行该程序段后,列表a的值可能是(  )
A.[-5,-2,4,0,1] B.[3,-1,0,2,-3]
C.[1,2,3,4,5] D.[0,4,0,-2,-4]
2.用数组a和b存储两个降序序列,用数组c存储合并后的降序序列。如a=[19,16,12,8,5],b=[20,15,14,10,6],c=[20,19,16,15,14,12,10,8,6,5]。实现该功能的程序段如下:
c=[-1]*(len(a)+len(b))
p=0;tot=len(a)
for i in range(len(a)):
  (1)     
for i in range(len(b)):
  while b[i]    p+=1
  if c[p]==-1:
    c[p]=b[i]
  else:
    for j in range((2)      ):
      c[j+1]=c[j]
    c[p]=b[i]
  tot+=1
上述程序段划线处可选代码为:
①c.append(a[i]) ②c[i]=a[i] ③tot,p-1,-1
④tot,p,-1 ⑤tot-1,p-1,-1
则(1)(2)处的代码依次为(  )
A.①③ B.①④
C.②⑤ D.②③
3.有如下Python程序:
a=[12,45,45,63,0,0,63]
cnt=0
for i in range(1,len(a)):
  j=i-1
  t=a[i]
  while j>=0 and t>a[j]:
    a[j+1]=a[j]
    j=j-1
    cnt=cnt+1
  a[j+1]=t
print(cnt)
运行该程序后,输出的结果是(  )
A.8 B.10
C.11 D.13
4.已排序的列表a有n个整型元素,现要查找出现次数最多的值并输出。若出现次数最多的值有多个,则输出最前面的一个。实现该功能的程序段如下,方框中应填入的正确代码为(  )
c,m,v=1,1,0
for i in range(1,n):
        
print(a[v])
A.if a[i]==a[i-1]:
  c+=1
  if c>m:
    m=c
    v=i
else:
  c=1
B.if a[i]==a[i-1]:
  c+=1
  if c>m:
    m=c
    v=i
  else:
    c=1
C.if a[i]==a[i-1]:
  c+=1
else:
  if c>m:
    m=c
    v=i-1
    c=1
D.if a[i]==a[i-1]:
  c+=1
else:
  if c>m:
    m=c
    v=i-1
  c=1
5.下列程序段是数组a中的数据分为被3整除、除3余1和除3余2共三部分:
#列表a初始值略
i=k=0;j=len(a)-1
while k<=j:
  if a[k]%3==0:
    a[i],a[k]=a[k],a[i]
    i+=1
  elif a[k]%3!=1:
    a[j],a[k]=a[k],a[j]
    k-=1;j-=1
  k+=1
运行该程序段后,这三部分对应的列表依次是(  )
A.a[:i],a[i:j],a[k:]
B.a[:i+1],a[i:j+1],a[j+1:]
C.a[:i],a[i:k],a[k:]
D.a[:i+1],a[i:j],a[k+1:]
6.列表nums有n(n>1)个非零整型元素,现要查找列表nums中乘积最大的连续序列,例如若nums的值为[-2,3,-1,2,-4],则其乘积最大的连续序列应为3、-1、2、-4,乘积为24。实现该功能的程序段如下,输出最大乘积mx,方框中应填入的正确代码为(  )
k=0;mx=1 #变量k存储负数的个数
st=ed=-1;m1=m2=1
for i in range(0,len(nums)):
  if nums[i]<0:
    k+=1
          
  mx*=nums[i]
if k % 2!=0:
  for t in nums[0:ed]:
    m1*=t
  for t in nums[st+1:len(nums)]:
    m2*=t
  mx=max(m1,m2)
print(mx)
A.if st==-1:
  st=i
ed=i
B.if st==-1:
  st=i
else:
  ed=i
C.if ed==-1:
  ed=i
st=i
D.if ed==-1:
  ed=i
else:
  st=i
7.有如下Python程序段:
n=6
a=[[0]*n for i in range(n)]
for i in range(n):
  for j in range(i+1):
    if j!=0 and j!=i:
      a[i][j]=a[i-1][j-1]+a[i-1][j]
    else:
      a[i][j]=1
程序执行后,a[4]的值是(  )
A.[1,3,3,1,0,0] B.[1,4,6,6,4,1]
C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]
8.有Python程序段如下:
n=5;m=6
a=[[i*n+j for j in range(n)]for i in range(m)]#生成了一个m行n列的二维列表
for i in range(m//2):
  for j in range(0,n,2):
    a[i][j],a[m-1-i][j]=a[m-1-i][j],a[i][j]
则执行程序后,a[0][0]和a[0][1]的值分别为(  )
A.25和1 B.26和2
C.0和1 D.25和26
9.有如下Python程序段:
import random
n=5;a=[0]*(n+1);c=[0]*11
for i in range(1,n+1):
  a[i]=random.randint(1,10) #随机生成[1,10]范围内的整数
  c[a[i]]+=1
for i in range(len(c)-1,0,-1):
  for j in range(c[i]):
    print(i,end=" ")
执行该程序段后,输出的结果可能为(  )
A.1 1 2 3 7 B.8 6 4 3 2
C.5 7 9 6 8 D.10 8 6 8 2
10.列表a有n个元素,将列表a的前p个元素(1≤p≤n)与后n-p个元素对调,且不改变这p个元素(或n-p个元素)之间的相对位置。例如,a=[1,2,3,4,5],当p=2时,对调后的结果为a=[3,4,5,1,2]。实现上述功能的部分Python程序段如下:
p=int(input("p="))
st1=0;ed1=p-1
st2=p;ed2=len(a)-1
while st1<=ed1 and st2<=ed2:
  i=st1;j=st2
  while i<=ed1 and j<=ed2:
    a[i],a[j]=a[j],a[i]
    i+=1;j+=1
  if i<=ed1:
    st1=i
  elif j<=ed2:
    st1=i
          
  else:
    break
方框中可选的代码为:
①edl=j ②ed1=j-1 ③st2=j ④st2=j-1
则选填的正确代码为(  )
A.①③ B.①④
C.②③ D.②④
1.中国动画电影《哪吒之魔童闹海》票房一路攀升,进入全球影史排行榜前20名。数组元素a[0]~a[n-1]已按票房降序存储排行榜,其中a[i][0]是电影名,a[i][1]是票房。《哪吒之魔童闹海》存储在a[pos]位置,现要实现该位置票房增加x,仍保持数组的有序性不变,实现该功能的自定义函数如下:
def sort(pos,x,a):
  n=len(a);i=pos
  a[pos][1]+=x
  while ①      :
    ②     
    i-=1
  return a
程序①②划线处的代码组合应为(  )
①i>0 and a[i][1]>a[i-1][1]
②a[i][1]>a[i-1][1]
③a[i],a[i-1]=a[i-1],a[i]
④a[i]=a[i-1]
A.①② B.①③
C.①④ D.②③
2.给定一个有序数组a,删除重复元素,使每个元素只出现一次,输出去重后的数组。实现该功能的程序段如下,方框中应填入的正确代码为(  )
p1,p2=1,1
while p2  while       :
    p2+=1
  if p1!=p2 and p2    a[p1]=a[p2]
    p1+=1;p2+=1
print(a[:p1]) #输出去重后的数组
A.p1B.p2C.p1D.p23.将数据key插入到一个非降序序列的数组a中,保持数组有序,其代码如下
a.append(key) #在列表a最后一个元素后面插入数据key
for i in range(len(a)-1,-1,-1):
  if i!=0 and ①      :
    a[i]=a[i-1]
  else:
    break
②     
则划线处应填写的代码依次是(  )
A.①a[i-1]>key  ②a[i+1]=key
B.①a[i]>key ②a[i]=key
C.①a[i-1]>key ②a[i]=key
D.①a[i]>key ②a[i+1]=key
4.数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值减2,并保持数组的有序性不变。实现该功能的程序段如下,方框中应填入的正确代码为(  )
t=a[pos]-2
i=pos
while       :
  a[i]=a[i-1]
  i-=1
a[i]=t
A.i>0
B.i>0 and tC.i>=0 and tD.i>0 and a[i]5.将数组b合并到非降序数组a中,依旧保持数组a有序。则划线处应填写的代码是(  )
for i in range(len(b)):
  a.append(0)
for i in range(len(b)):
  ①     
  while j>=0 and a[j]>b[i]:
    a[j+1]=a[j]
    j-=1
  ②     
A.①j=len(a)-len(b)     ②a[j]=b[i]
B.①j=len(a)-len(b)+i ②a[j+1]=b[i]
C.①j=len(a)-len(b)-1+i ②a[j]=b[i]
D.①j=len(a)-len(b)-1+i ②a[j+1]=b[i]
6.有Python代码段如下:
a=[11,4,2,13,6,5,3,6,19,1]
for i in range(1,len(a)):
  key=a[i];j=i
  while (1)      :
    a[j]=a[j-1]
    j-=1
  (2)     
划线处(1)、(2)处可选代码如下:
①j>0 and key=0 and key③a[j]=key ④a[j-1]=key为使得数组a实现升序排序,则划线处代码正确的是(  )
A.①③ B.①④
C.②③ D.②④
7.某Python程序段如下所示:
import random
lst=[2,1,7,5,5,9,8,9,3,8]
b=[0]*10
for i in range(10):
  b[lst[i]]+=1
j=0
k=random.randint(3,6)
while k>b[j]:
  k-=b[j];j+=1
运行该程序,j的值不可能为(  )
A.8 B.7
C.5 D.3
8.有如下Python程序段:
c,m=0,0
for i in range(2,len(a)):
  if a[i-2]+a[i-1]==a[i]:
    c+=1
    if c>m:
      m=c
  else:
    c=0
若列表a=[2,1,3,4,5,9,14,23],执行该程序段后,变量m的值是(  )
A.0 B.1
C.2 D.3
9.有如下Python程序段,功能为删除非降序序列中的重复数:
a=[2,2,2,5,5,5,8]
k=i=0
while (1)      :
  if a[i]!=a[i+1]:
    k+=1
    (2)     
  i+=1
print(a[:k+1])
该程序执行结果为[2,5,8],划线处可选代码为
①i则(1)(2)处代码依次为(  )
A.①③ B.①④
C.②③ D.②④
10.数组元素a[0]至a[n-1]依次存放着n个不重复的正整数。现要在数组a中按顺序找出一组升序子序列,可以是不连续,但要求长度最长(若有多个长度相等的最长子序列时,输出第一个)。例如:数组a的值为[2,11,4,13,5,17],其中最长的升序子序列是[2,11,13,17]。实现该功能的程序段如下:
a=[2,11,4,13,5,7]
n=len(a);ans=[]
d=[[1,-1] for i in range(n)]
#d[i]包含2个数据项,d[i][0]记录i位置结尾的最长升序子序列的长度
#d[i][1]记录 i 结尾的最长升序子序列前一数据的索引位置
maxlen=0;k=-1
for i in range(1,n):
  for j in range(i):
    if a[j]      (2)     
      d[i][1]=j
  if d[i][0]>maxlen:
    maxlen=d[i][0];k=i
while k!=-1:
  ans.append(a[k])
  k=d[k][1]
print(ans[::-1])
其划线处可选代码如下:
①d[i][0]=d[i][0]
③d[i][0]=d[i][0]+1 ④d[i][0]=d[j][0]+1
则划线处(1)(2)应填的合适代码依次为(  )
A.①③ B.①④
C.②③ D.②④
11.有如下Python程序段:
b=[];n=len(a)
for i in range(n):
  for j in range(len(a[i])):
    if i      b.append(a[i][j])
执行该程序段后,若数组b的值为[3,6,7,9],那么数组a的值不可能的是(  )
A.[[1,3,6,7],[2,4,7,9],[5,2,3,7]]
B.[[1,3,6,7],[1,3,6,7],[1,3,6,9]]
C.[[1,3,6,7],[2,4,9,7],[5,2,3,8]]
D.[[1,3,6,7],[2,6,9,7],[5,2,3,3]]
12.有如下Python程序段:
d=[12,45,24,63,2,3,60,50]
cnt=0
step=int(input("输入1~4之间的整数:"))
for i in range(step,len(d)):
  j=i-step
  t=d[i]
  while j>=0 and t>d[j]:
    d[j+step]=d[j]
    j=j-step
  d[j+step]=t
运行该程序段,数组d的值不可能是(  )
A.[63,60,50,45,24,12,3,2]
B.[63,50,24,60,45,2,12,3]
C.[12,45,60,63,2,3,24,50]
D.[60,63,24,50,12,45,2,3]
13.子序列是指数组中连续的若干个元素(至少1个元素)。数组a中有n个整型元素(有正有负),现要查找和最大的子序列,并输出和。实现该功能的程序段如下,方框中应填入的正确代码为(  )
def maxsub(a):
  tot=-1;tmp=0
  for num in a:
    tmp+=num
          
  return tot
a=[-2,1,-3,4,-1,2,1,-5,4]
print (maxsub(a))
A.if tmp>tot:
  tot=tmp
if tmp  tmp=0
B.if tmp>tot:
  tot=tmp
  tmp=0
if tmp<0:
  tmp=0
C.if tmp>tot:
  tot=tmp
if tmp<0:
  tmp=0
D.if tmp>tot:
  tot=tmp
  tmp=0
if tot<0:
  tot=0
14.有如下Python程序段:
a=[3,3,7,8,8,10,12,99]
j=k=res=0
for i in range(len(a)-1):
  while a[j]-a[i]<5:
    j=j+1;
  while a[k]-a[i]<=5:
    k=k+1
  if a[j]-a[i]==5 and a[k-1]-a[i]==5:
    res+=k-j
执行程序后,变量res的值是(  )
A.2 B.3
C.4 D.5
15.有如下python程序:
#输入包含5个不重复元素的数组a,代码略
i,c=0,0
key=int(input("key="))
for j in range(len(a)):
  if a[j]%key==0:
    c+=1
  else:
    a[j-c]=a[j]
print(a)
运行该程序,若输入key为2,则输出的a不可能为(  )
A.[3,7,5,4,5] B.[3,7,1,5,5]
C.[3,5,0,3,5] D.[9,7,4,7,3]
16.数组元素a[0]至a[n-1]依次存放着n个整数,现要用last将数组元素划分成两部分,小于key的整数均位于last的左侧。例如:n为5,数组a为[3,9,7,4,8],key为7,完成划分后last为2,数组a为[4,3,7,9,8]。实现该功能的程序段如下:
from random import randint
k=randint(0,n-1);key=a[k] #从数组a中随机选择一个整数赋值给key
a[0],a[k]=a[k],a[0]
(1)      
for i in range(1,n):
  if a[i]    (2)      
    (3)      
a[0],a[last]=a[last],a[0]
方框中可选的代码为:
①last=-1 ②last=0 ③a[last],a[i]=a[i],a[last]
④last+=1 ⑤a[last]=a[i]
则方框中应依次填入的正确代码为(  )
A.①③④ B.①④⑤
C.②④③ D.②⑤③
17.有如下Python程序段:
from random import randint
s,i,ans=1,0,0
k=randint(10,24) #randint(10,24)随机生成10到24(含10和24)之间的整数
for j in range(len(nums)):
  s=s*nums[j]
  while s>=k:
    s=s/nums[i]
    i+=1
  ans+=j-i+1
若nums的值为[2,3,4,5],执行如下程序段后,变量ans的值不可能是(  )
A 4 B.5
C.6 D.7
18.某Python程序段的功能如下:根据列表a中元素大小关系,降序排列各元素的索引,并返回排序后的索引。如列表a为[3,4,2,5,1],排序后得到的索引列表b为[3,1,0,2,4]。
#读取n个数据依次存储到列表a中
b=[i for i in range(n)]
end=0
while end  last=n-1
        
  end=last
方框中应填入的代码为(  )
A.for j in range(1,end+2):
  if a[b[j]]>a[b[j-1]]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j-1
B.for j in range(n-1,end,-1):
  if a[b[j]]>a[b[j-1]]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j
C.for j in range(1,end+2):
  if b[j]>b[j-1]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j-1
D.for j in range(n-1,end,-1):
  if b[j]>b[j-1]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j4.5 数 组
学习目标 
1.知道数组的概念和特性,能够辨别程序设计中数据的组织形式,领会数据结构对数据处理的重要性。
2.针对生活中简单的实际问题,根据数据及其关系特征,选择数组组织、存储数据,编写程序实现相关操作,并能迁移到与之相关的其他问题解决中。
(2024年1月浙江选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=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
解析 本题考查插入排序的算法实现。先将7保存在a[n-1],变量i从n-2遍历到x,将当前位置i后面的值移动到当前位置。
  数组是典型的顺序存储结构,是将逻辑上相邻的数据节点存储在物理位置相邻的存储单元中,最大特点是可以通过下标来直接访问某个数组元素,因此访问数组元素较快。若要删除数组中间位置某个元素,必须将该元素后面的元素一个个往前移动,若在中间位置前插入一个新元素,必须将其后面的元素一个个往后移动,因此插入或删除元素的效率较低。
m行n列的二维数组可以看成有n个一维数组共享m个下标的集合,在数据加工处理时,效率会比一维数组高。在处理二维数组的题目时,先要画出二维数组的结构,理解每个数组元素的含义,理解如何定位到某个数据项。
例1 数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值加1,并保持数组的有序性不变,实现该功能的程序段如下,划线处应填入的正确代码为(  )
t=a[pos]+1
i=pos
while       :
  a[i]=a[i+1]
  i+=1
a[i]=t
A.iB.ia[i+1]
C.ia[i+1]
D.i<=n-1 or t>a[i]
思维点拨
明考向 本题考查顺序查找和插入排序
精点拨 先将a[pos]+1的值存入变量t,即要将t插入到正确的位置以确保数组仍然有序。因原数组元素已升序排列,所以从pos位置开始向后顺序查找正确位置,并在查找的同时进行数组元素的前移操作,以便空出t应该在的位置。整个while循环即实现上述功能,循环条件应为:确保语句a[i]=a[i+1]不能超出数组范围(即i+1<=n-1或ia[i+1])。C选项语句t=a[pos]+1中,并没有改变a数组元素的值,因此a[i]>a[i+1]不可能成立
答案 B
变式1 数组元素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  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
答案 B
解析 本题考查顺序查找和插入排序。通过while循环找到插入位置i,循环变量k从最后一个位置n-1开始,把a[k-1]往后移动a[k],k循环到i+1结束。A选项k的初值为n,越界。B选项从索引n-1开始,依次把数据从后往前移动。C选项从前往后移动数据,造成后面的数据被覆盖,且越界。D选项从前往后移动数据,造成后面的数据被覆盖。
例2 (2025年1月浙江选考)列表c长度为100,如图所示,其中c[10]~c[89]各元素的值均为10以内的随机正整数。执行如下程序段,输出的最后一行是(  )
i 0 1 2 3 4 5 6 7 8 9 …… 90 91 92 93 94 95 96 97 98 99
c[i] 1 1 1 1 2 3 2 3 2 3 …… 2 3 2 2 2 2 1 1 1 1
pa=[0,0,0,0,0]
pb=[0,0,0,0,0]
h,t=0,4
tmp=0
for k in range(100):
  pa[t]=c[k]
  pb[t]=tmp+pa[t]-pa[h]
  print(pb[h],pb[t],k,pa,pb,h,t)
  tmp=pb[t]
  h=(h+1) % 5
  t=(t+1) % 5
                               
A.5 4 B.8 4
C.9 5 D.9 9
答案 B
解析 本题考查数据的累加求和循环列表的应用。指针h和t都是pb的下标,通过求余操作,当其值为5时,又回到0,即值在0至4的范围内循环,且t与h始终相差4,是一个循环列表。若三条语句pa[t]=c[k]、pb[t]=tmp+pa[t]和tmp=pb[t]在for语句内循环,则其功能是对c数组中数据进行累加求和,而pb[t]的值为tmp+pa[t]-pa[h],即累加求和的基础上减去pa[h],当k小于4时,pa[h]的值均为0,即pb的前4项依次为c数组累加和,pb[4]的值为c[0]至c[4]五项的和减去c[0]的值,因此pb[t]为第t项以及前4项的和。最后一次循环时,前4项的和是1+1+1+1=4,而h的值为t-4,该位置的前4项和为2+2+2+2=8。
变式2 列表lst长度为20,如下表所示,其中lst[5]~lst[15]各元素的值均为小于等于0的随机整数。执行如下程序段,输出结果是(  )
i 0 1 2 3 4 …… 16 17 18 19
lst[i] 2 -3 9 1 2 …… -2 0 -6 5
n=len(lst);p=lst[0]
for i in range(0,n):
  tmps=0
  j=i
  while (j+1)%n!=i:
    tmps+=lst[j]
    if tmps>p:
      p=tmps
    j=(j+1)%n
print(p)
A.10 B.12
C.16 D.19
答案 C
解析 本题考查数据的累加求和循环列表的应用。变量i是一段连续序列的开始位置,j是结束位置,序列最大长度不能超过周期n。对这个序列进行求和,找到序列中的最大值。A选项当i为2时,j为3,序列的和为10。B选项当i为3时,j为4,序列的和达到12,是序列和最大值。B选项当i为19时,j为4,序列的和达到16,是序列和最大值。D选项连续最大值为16,不可能达到19。
1.有如下Python程序段:
#随机产生5个整数,存储在列表a中
for i in range(1,5):
  k=a[i]
  j=i-1
  while j>=0 and abs(a[j]-2)>abs(k-2):
    a[j+1]=a[j]
    j-=1
  a[j+1]=k
执行该程序段后,列表a的值可能是(  )
A.[-5,-2,4,0,1] B.[3,-1,0,2,-3]
C.[1,2,3,4,5] D.[0,4,0,-2,-4]
答案 D
解析 程序功能是按abs(a[i]-2)升序排序,即最后每个数据项减2后求绝对值应为升序。
2.用数组a和b存储两个降序序列,用数组c存储合并后的降序序列。如a=[19,16,12,8,5],b=[20,15,14,10,6],c=[20,19,16,15,14,12,10,8,6,5]。实现该功能的程序段如下:
c=[-1]*(len(a)+len(b))
p=0;tot=len(a)
for i in range(len(a)):
  (1)     
for i in range(len(b)):
  while b[i]    p+=1
  if c[p]==-1:
    c[p]=b[i]
  else:
    for j in range((2)      ):
      c[j+1]=c[j]
    c[p]=b[i]
  tot+=1
上述程序段划线处可选代码为:
①c.append(a[i]) ②c[i]=a[i] ③tot,p-1,-1
④tot,p,-1 ⑤tot-1,p-1,-1
则(1)(2)处的代码依次为(  )
A.①③ B.①④
C.②⑤ D.②③
答案 C
解析 (1)将数组a中数据写入数组c中,由于数组c中已经有len(a)+len(b)个-1,因此不用再用append方法添加。(2)遍历数组b,并将元素插入到数组c中。tot的初值为len(a),每添加一个数组b的元素,tot值加1,因此tot表示已经合并元素的个数。p表示数组元素b要插入到c中的位置。语句c[j+1]=c[j]是把当前位置j元素移动到后面一个位置,因此j的初值为tot-1,终值为p。range是一个左闭右开的区间,若要取到p,终值需加上步长。
3.有如下Python程序:
a=[12,45,45,63,0,0,63]
cnt=0
for i in range(1,len(a)):
  j=i-1
  t=a[i]
  while j>=0 and t>a[j]:
    a[j+1]=a[j]
    j=j-1
    cnt=cnt+1
  a[j+1]=t
print(cnt)
运行该程序后,输出的结果是(  )
A.8 B.10
C.11 D.13
答案 B
解析 本题考查插入排序算法。内循环用于查找合适的插入位置,从第2个数据开始插入到合适位置。待插入a[i]暂时存放于变量t中,若t比前面的数据a[j]大,则将数据a[j]移动到后面,然后继续往前检查直到找到合适的位置将t插入。
4.已排序的列表a有n个整型元素,现要查找出现次数最多的值并输出。若出现次数最多的值有多个,则输出最前面的一个。实现该功能的程序段如下,方框中应填入的正确代码为(  )
c,m,v=1,1,0
for i in range(1,n):
        
print(a[v])
A.if a[i]==a[i-1]:
  c+=1
  if c>m:
    m=c
    v=i
else:
  c=1
B.if a[i]==a[i-1]:
  c+=1
  if c>m:
    m=c
    v=i
  else:
    c=1
C.if a[i]==a[i-1]:
  c+=1
else:
  if c>m:
    m=c
    v=i-1
    c=1
D.if a[i]==a[i-1]:
  c+=1
else:
  if c>m:
    m=c
    v=i-1
  c=1
答案 A
解析 本题考查一维列表的遍历和最值的查找。已排序的列表a有n个整型元素,当条件a[i]==a[i-1]成立时,表示有连续相等的数量c。A选项每找到一个相等的值,求解数量的最大值,并保存此时的索引位置v,若不相等时初始化c的个数为1。B选项初始化c的个数就在两个不相等的值时。C选项当两个数相等时进行计数,当两个数不相等时,进行最值的查找,同时初始c的值为1,但该选项c的初始化发生在找到最大值时。D选项若长度的最大值发生在最后,即该列表最后的几个数是长度是最大值时,只是在进行计数,并未进行最大值的查找。
5.下列程序段是数组a中的数据分为被3整除、除3余1和除3余2共三部分:
#列表a初始值略
i=k=0;j=len(a)-1
while k<=j:
  if a[k]%3==0:
    a[i],a[k]=a[k],a[i]
    i+=1
  elif a[k]%3!=1:
    a[j],a[k]=a[k],a[j]
    k-=1;j-=1
  k+=1
运行该程序段后,这三部分对应的列表依次是(  )
A.a[:i],a[i:j],a[k:]
B.a[:i+1],a[i:j+1],a[j+1:]
C.a[:i],a[i:k],a[k:]
D.a[:i+1],a[i:j],a[k+1:]
答案 C
解析 指针i和j分别指向数组的头和尾,变量k从0开始遍历数组,当条件a[k]%3==0成立时,交接a[i]和a[k],指针i向后移动,即把3的倍数交接到位置i的前面。当a[k]%3的值为2时,交接a[j]和a[k],指针j向前移动,即把除3余2的数交接到位置j的后面。当k等于j+1时,结束循环。因此[0,i-1]区间是3的倍数。[i,j]或[i,k-1]区间保存除3余1的数,j+1或k开始的数是除3余2。
6.列表nums有n(n>1)个非零整型元素,现要查找列表nums中乘积最大的连续序列,例如若nums的值为[-2,3,-1,2,-4],则其乘积最大的连续序列应为3、-1、2、-4,乘积为24。实现该功能的程序段如下,输出最大乘积mx,方框中应填入的正确代码为(  )
k=0;mx=1 #变量k存储负数的个数
st=ed=-1;m1=m2=1
for i in range(0,len(nums)):
  if nums[i]<0:
    k+=1
          
  mx*=nums[i]
if k % 2!=0:
  for t in nums[0:ed]:
    m1*=t
  for t in nums[st+1:len(nums)]:
    m2*=t
  mx=max(m1,m2)
print(mx)
A.if st==-1:
  st=i
ed=i
B.if st==-1:
  st=i
else:
  ed=i
C.if ed==-1:
  ed=i
st=i
D.if ed==-1:
  ed=i
else:
  st=i
答案 A
解析 程序功能是求乘积最大的连续序列。先求所有数据的乘积mx,若负数个数为偶数,则mx就是最大的乘积;若负数个数为奇数,需要找出最后一个负数之前,第一个负数之后的最大乘积。k统计负数的数量,st跟踪第1个负数位置,ed跟踪最后一个负数位置。
7.有如下Python程序段:
n=6
a=[[0]*n for i in range(n)]
for i in range(n):
  for j in range(i+1):
    if j!=0 and j!=i:
      a[i][j]=a[i-1][j-1]+a[i-1][j]
    else:
      a[i][j]=1
程序执行后,a[4]的值是(  )
A.[1,3,3,1,0,0] B.[1,4,6,6,4,1]
C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]
答案 C
解析 本题考查二维数组的创建和遍历。先创建一个6行6列的二维数组,遍历二维数组的每一行,内循环从0至i,因此只对二维数组的左下半部分进行赋值。将第1列和主对角线(i和j相等)的数据全部赋值为1,其他数据为上一行的前一个和上一行的当前列之和,因此程序的功能是构建一个杨辉三角。
8.有Python程序段如下:
n=5;m=6
a=[[i*n+j for j in range(n)]for i in range(m)]#生成了一个m行n列的二维列表
for i in range(m//2):
  for j in range(0,n,2):
    a[i][j],a[m-1-i][j]=a[m-1-i][j],a[i][j]
则执行程序后,a[0][0]和a[0][1]的值分别为(  )
A.25和1 B.26和2
C.0和1 D.25和26
答案 A
解析 生成了一个6行5列的二维列表,每行的内容依次为0-4,5-9,…,25-29。
外循环执行3次,每次和对称行中的数据进行交换。内循环的步长为2,即偶数列不执行。a[0][0]和a[5][0]进行交换,即0和25互换,a[0][1]的值不变。
9.有如下Python程序段:
import random
n=5;a=[0]*(n+1);c=[0]*11
for i in range(1,n+1):
  a[i]=random.randint(1,10) #随机生成[1,10]范围内的整数
  c[a[i]]+=1
for i in range(len(c)-1,0,-1):
  for j in range(c[i]):
    print(i,end=" ")
执行该程序段后,输出的结果可能为(  )
A.1 1 2 3 7 B.8 6 4 3 2
C.5 7 9 6 8 D.10 8 6 8 2
答案 B
解析 程序功能生成n个[1,10]范围内的整数并存入相应的桶c,从后往前依次遍历数组c并从大到小输出每个桶中数据。
10.列表a有n个元素,将列表a的前p个元素(1≤p≤n)与后n-p个元素对调,且不改变这p个元素(或n-p个元素)之间的相对位置。例如,a=[1,2,3,4,5],当p=2时,对调后的结果为a=[3,4,5,1,2]。实现上述功能的部分Python程序段如下:
p=int(input("p="))
st1=0;ed1=p-1
st2=p;ed2=len(a)-1
while st1<=ed1 and st2<=ed2:
  i=st1;j=st2
  while i<=ed1 and j<=ed2:
    a[i],a[j]=a[j],a[i]
    i+=1;j+=1
  if i<=ed1:
    st1=i
  elif j<=ed2:
    st1=i
          
  else:
    break
方框中可选的代码为:
①edl=j ②ed1=j-1 ③st2=j ④st2=j-1
则选填的正确代码为(  )
A.①③ B.①④
C.②③ D.②④
答案 C
解析 st1和ed1依次为前半段的开始和结束位置,st2和ed2依次为后半段的开始和结束位置,若其中一段不存在,则结束循环。内循环中,变量i和j依次从两段的开始位置遍历,依次交换两段对应位置的元素值,若两段的长度相等(变量i和j同时超出终值位置),则结束本轮交换,若变量j超出终值位置,则修改前半段的开始位置为i。若变量i超出终值位置,则修改前半段的开始位置为i,结束位置为j-1,后半段的开始位置为j。如a的值为[0,1,2,3,4,5],p的值2,内循环结束后,a的值为[2,3,0,1,4,5],可得新的两段的开始位置和结束位置。
1.中国动画电影《哪吒之魔童闹海》票房一路攀升,进入全球影史排行榜前20名。数组元素a[0]~a[n-1]已按票房降序存储排行榜,其中a[i][0]是电影名,a[i][1]是票房。《哪吒之魔童闹海》存储在a[pos]位置,现要实现该位置票房增加x,仍保持数组的有序性不变,实现该功能的自定义函数如下:
def sort(pos,x,a):
  n=len(a);i=pos
  a[pos][1]+=x
  while ①      :
    ②     
    i-=1
  return a
程序①②划线处的代码组合应为(  )
①i>0 and a[i][1]>a[i-1][1]
②a[i][1]>a[i-1][1]
③a[i],a[i-1]=a[i-1],a[i]
④a[i]=a[i-1]
A.①② B.①③
C.①④ D.②③
答案 B
解析 先修改a[pos][1]的值,变量i从pos开始,不断地跟他前面的数据a[i-1][1]进行比较,如果大于前面的数据,将进行交换,但要注意边界,最后一次比较的i与i-1的值依次为1和0,因此i必须大于0。
2.给定一个有序数组a,删除重复元素,使每个元素只出现一次,输出去重后的数组。实现该功能的程序段如下,方框中应填入的正确代码为(  )
p1,p2=1,1
while p2  while       :
    p2+=1
  if p1!=p2 and p2    a[p1]=a[p2]
    p1+=1;p2+=1
print(a[:p1]) #输出去重后的数组
A.p1B.p2C.p1D.p2答案 B
解析 该数组是有序的,从输出语句print(a[:p1])来看,p1表示不重复元素的个数,因此比较的对象为a[p2]和a[p1-1]。
3.将数据key插入到一个非降序序列的数组a中,保持数组有序,其代码如下
a.append(key) #在列表a最后一个元素后面插入数据key
for i in range(len(a)-1,-1,-1):
  if i!=0 and ①      :
    a[i]=a[i-1]
  else:
    break
②     
则划线处应填写的代码依次是(  )
A.①a[i-1]>key  ②a[i+1]=key
B.①a[i]>key ②a[i]=key
C.①a[i-1]>key ②a[i]=key
D.①a[i]>key ②a[i+1]=key
答案 C
解析 ①语句a.append(key)的功能是将key添加a数组最后位置,即key位于len(a)-1,有序的位置范围是[0,len(a)-2],从后往前查找key的插入位置,key应与len(a)-2及前面的数据进行比较。②若条件a[i-1]>key不成立,则位置i就是存储key的位置。
4.数组元素a[0]~a[n-1]已按升序排列,现要将a[pos](0≤pos≤n-1)的值减2,并保持数组的有序性不变。实现该功能的程序段如下,方框中应填入的正确代码为(  )
t=a[pos]-2
i=pos
while       :
  a[i]=a[i-1]
  i-=1
a[i]=t
A.i>0
B.i>0 and tC.i>=0 and tD.i>0 and a[i]答案 B
解析 数组a中数据升序排序,将a[pos]处的值减2赋值给变量t,若要保证a数组依然有序,则需判断t的值是否需要往前移动。移动条件是t的值比前面i-1(i指向pos)小的话,需要前面元素的值后移a[i]=a[i-1],同时i必须大于0,才能保证a[i-1]不会越界。
5.将数组b合并到非降序数组a中,依旧保持数组a有序。则划线处应填写的代码是(  )
for i in range(len(b)):
  a.append(0)
for i in range(len(b)):
  ①     
  while j>=0 and a[j]>b[i]:
    a[j+1]=a[j]
    j-=1
  ②     
A.①j=len(a)-len(b)     ②a[j]=b[i]
B.①j=len(a)-len(b)+i ②a[j+1]=b[i]
C.①j=len(a)-len(b)-1+i ②a[j]=b[i]
D.①j=len(a)-len(b)-1+i ②a[j+1]=b[i]
答案 D
解析 本题考查数组元素的移动。①程序的功能采用插入排序,将数组b中数据插入到数组a中,保持数组a为一个升序的序列。语句j=len(a)-len(b)-1+i的作用是取出数组a中最后有序的位置,while的功能是在数组a中找到b[i]应插入的位置,因此查找的条件是a[j]大于b[i],但同时保证j的位置是有效的。②找到第1个不符合条件位置j,那么数据b[i]应插入的位置是j+1。
6.有Python代码段如下:
a=[11,4,2,13,6,5,3,6,19,1]
for i in range(1,len(a)):
  key=a[i];j=i
  while (1)      :
    a[j]=a[j-1]
    j-=1
  (2)     
划线处(1)、(2)处可选代码如下:
①j>0 and key=0 and key③a[j]=key ④a[j-1]=key为使得数组a实现升序排序,则划线处代码正确的是(  )
A.①③ B.①④
C.②③ D.②④
答案 A
解析 考查插入排序的算法实现。本题中插入排序的思路为将第i个元素插入至已有序的范围[0,i],故需要将a[i]的元素和范围[0,i-1]的元素进行比较,程序中a[i]的值存入key中,[0,i-1]采用j-1来进行枚举,所以j的取值最多只能取到1,当j的值为0时,不要再继续执行,故而第1空为j>0andkey7.某Python程序段如下所示:
import random
lst=[2,1,7,5,5,9,8,9,3,8]
b=[0]*10
for i in range(10):
  b[lst[i]]+=1
j=0
k=random.randint(3,6)
while k>b[j]:
  k-=b[j];j+=1
运行该程序,j的值不可能为(  )
A.8 B.7
C.5 D.3
答案 A
解析 for循环用于统计lst中各个元素的个数,b的值为[0,1,1,1,0,2,0,2,0,1,2,2]。产生一个3至6之间的随机数,从位置0开始遍历数组b,若符合条件k>b[j],k减去 b[j],j向后移动,程序的功能是统计b前n项的和,当累加和大于等于k时结束循环,得到累加的项数j。前7项的和为5,因此项数不可能是8。
8.有如下Python程序段:
c,m=0,0
for i in range(2,len(a)):
  if a[i-2]+a[i-1]==a[i]:
    c+=1
    if c>m:
      m=c
  else:
    c=0
若列表a=[2,1,3,4,5,9,14,23],执行该程序段后,变量m的值是(  )
A.0 B.1
C.2 D.3
答案 D
解析 从第3个位置开始遍历,若该位置上值是前两个位置上数之和,统计连续符合这些条件的数据个数c,并找出c的最大值m。数据3,4符合条件,共连续2个数。数据9,14,23符合条件,共连续3个数。
9.有如下Python程序段,功能为删除非降序序列中的重复数:
a=[2,2,2,5,5,5,8]
k=i=0
while (1)      :
  if a[i]!=a[i+1]:
    k+=1
    (2)     
  i+=1
print(a[:k+1])
该程序执行结果为[2,5,8],划线处可选代码为
①i则(1)(2)处代码依次为(  )
A.①③ B.①④
C.②③ D.②④
答案 C
解析 从输出语句print(a[:k+1])来看,k表示删除重复后数字个数。a[i]和a[i+1]比较,因此i的最大位置只能为len(a)-2。k的初值为0,保存了第1个数字,当条件a[i]!=a[i+1]成立时,k先加1,因此将a[i+1]保存到a[k]中。
10.数组元素a[0]至a[n-1]依次存放着n个不重复的正整数。现要在数组a中按顺序找出一组升序子序列,可以是不连续,但要求长度最长(若有多个长度相等的最长子序列时,输出第一个)。例如:数组a的值为[2,11,4,13,5,17],其中最长的升序子序列是[2,11,13,17]。实现该功能的程序段如下:
a=[2,11,4,13,5,7]
n=len(a);ans=[]
d=[[1,-1] for i in range(n)]
#d[i]包含2个数据项,d[i][0]记录i位置结尾的最长升序子序列的长度
#d[i][1]记录 i 结尾的最长升序子序列前一数据的索引位置
maxlen=0;k=-1
for i in range(1,n):
  for j in range(i):
    if a[j]      (2)     
      d[i][1]=j
  if d[i][0]>maxlen:
    maxlen=d[i][0];k=i
while k!=-1:
  ans.append(a[k])
  k=d[k][1]
print(ans[::-1])
其划线处可选代码如下:
①d[i][0]=d[i][0]
③d[i][0]=d[i][0]+1 ④d[i][0]=d[j][0]+1
则划线处(1)(2)应填的合适代码依次为(  )
A.①③ B.①④
C.②③ D.②④
答案 D
解析 d[i][0]记录i位置结尾的最长升序子序列的长度。枚举位置1至n-1中连续升序系列的长度,各位置i的连续升序长度计算方法:变量j从0开始枚举到i-1,若a[j]小于a[i]且该位置序列长度d[j][0]大于或等于d[i][0],那么位置j是0至i连续系列中一个元素,因此i位置结尾的最长升序子序列的长度将增加一个。
11.有如下Python程序段:
b=[];n=len(a)
for i in range(n):
  for j in range(len(a[i])):
    if i      b.append(a[i][j])
执行该程序段后,若数组b的值为[3,6,7,9],那么数组a的值不可能的是(  )
A.[[1,3,6,7],[2,4,7,9],[5,2,3,7]]
B.[[1,3,6,7],[1,3,6,7],[1,3,6,9]]
C.[[1,3,6,7],[2,4,9,7],[5,2,3,8]]
D.[[1,3,6,7],[2,6,9,7],[5,2,3,3]]
答案 C
解析 在矩阵的右外角中查找不重复的数。C选项数组b的值为[3,6,7,9,8]。
12.有如下Python程序段:
d=[12,45,24,63,2,3,60,50]
cnt=0
step=int(input("输入1~4之间的整数:"))
for i in range(step,len(d)):
  j=i-step
  t=d[i]
  while j>=0 and t>d[j]:
    d[j+step]=d[j]
    j=j-step
  d[j+step]=t
运行该程序段,数组d的值不可能是(  )
A.[63,60,50,45,24,12,3,2]
B.[63,50,24,60,45,2,12,3]
C.[12,45,60,63,2,3,24,50]
D.[60,63,24,50,12,45,2,3]
答案 B
解析 程序实现按step为步长进行分组排序。当step为1时,每 1个元素一组,结果为[63,60,50,45,24,12,3,2]。当step为2,每隔1个元素为一组,结果为[60,63,24,50,12,45,2,3]。当step为3的排序结果为[63,50,24,60,45,3,12,2]。当step为4 排序结果为[12,45,60,63,2,3,24,50]。
13.子序列是指数组中连续的若干个元素(至少1个元素)。数组a中有n个整型元素(有正有负),现要查找和最大的子序列,并输出和。实现该功能的程序段如下,方框中应填入的正确代码为(  )
def maxsub(a):
  tot=-1;tmp=0
  for num in a:
    tmp+=num
          
  return tot
a=[-2,1,-3,4,-1,2,1,-5,4]
print (maxsub(a))
A.if tmp>tot:
  tot=tmp
if tmp  tmp=0
B.if tmp>tot:
  tot=tmp
  tmp=0
if tmp<0:
  tmp=0
C.if tmp>tot:
  tot=tmp
if tmp<0:
  tmp=0
D.if tmp>tot:
  tot=tmp
  tmp=0
if tot<0:
  tot=0
答案 C
解析 本题考查算法的综合应用能力。寻找和最大的子序列问题,基本算法是边求和边求最大值。tmp用来求连续子序列的和,当和小于0时,tmp初始化为0,再次求下一段的和及最大值。
14.有如下Python程序段:
a=[3,3,7,8,8,10,12,99]
j=k=res=0
for i in range(len(a)-1):
  while a[j]-a[i]<5:
    j=j+1;
  while a[k]-a[i]<=5:
    k=k+1
  if a[j]-a[i]==5 and a[k-1]-a[i]==5:
    res+=k-j
执行程序后,变量res的值是(  )
A.2 B.3
C.4 D.5
答案 D
解析 程序统计两个数相减等于5的不同位置上数对的数量。当i为0时,j和k的值为3和5,res值为2;当i为1时,j和k的值不变,res累加为4;i为2时,j和k的值为6和7,res值为5;再往后遍历,res值不变。
15.有如下python程序:
#输入包含5个不重复元素的数组a,代码略
i,c=0,0
key=int(input("key="))
for j in range(len(a)):
  if a[j]%key==0:
    c+=1
  else:
    a[j-c]=a[j]
print(a)
运行该程序,若输入key为2,则输出的a不可能为(  )
A.[3,7,5,4,5] B.[3,7,1,5,5]
C.[3,5,0,3,5] D.[9,7,4,7,3]
答案 D
解析 遍历数组a,变量c表示a[j]整除key(偶数)个数,若不是偶数,将其放在前面。A选项a初始值是[3,7,偶,4,5],偶表示该位置上是一个偶数。B选项第4个是偶数,则后面的5覆盖而来。C选项a初始值是[偶,偶,0,3,5]。D选项第2个是偶数,则7覆盖第2个数,但3一定要覆盖4。
16.数组元素a[0]至a[n-1]依次存放着n个整数,现要用last将数组元素划分成两部分,小于key的整数均位于last的左侧。例如:n为5,数组a为[3,9,7,4,8],key为7,完成划分后last为2,数组a为[4,3,7,9,8]。实现该功能的程序段如下:
from random import randint
k=randint(0,n-1);key=a[k] #从数组a中随机选择一个整数赋值给key
a[0],a[k]=a[k],a[0]
(1)      
for i in range(1,n):
  if a[i]    (2)      
    (3)      
a[0],a[last]=a[last],a[0]
方框中可选的代码为:
①last=-1 ②last=0 ③a[last],a[i]=a[i],a[last]
④last+=1 ⑤a[last]=a[i]
则方框中应依次填入的正确代码为(  )
A.①③④ B.①④⑤
C.②④③ D.②⑤③
答案 C
解析 语句“a[0],a[k]=a[k],a[0]”是将a[k](值为key)交换到a[0]的位置,当条件a[i]17.有如下Python程序段:
from random import randint
s,i,ans=1,0,0
k=randint(10,24) #randint(10,24)随机生成10到24(含10和24)之间的整数
for j in range(len(nums)):
  s=s*nums[j]
  while s>=k:
    s=s/nums[i]
    i+=1
  ans+=j-i+1
若nums的值为[2,3,4,5],执行如下程序段后,变量ans的值不可能是(  )
A 4 B.5
C.6 D.7
答案 A
解析 由于k的取值最大为24,s累乘=2*3*4=24,此时ans累加已经等于6。当s大于等于k的时候i才会加1,s=24/2=12*5=60/3=30,i等于1和2,所以ans=6有可能,若取20,s=30大于20会再增加一次i=3,此时ans=6-3-3+1,故7也有可能;再考虑取最小值k=10的情况,ans的值为3,故不可能的是A选项。
18.某Python程序段的功能如下:根据列表a中元素大小关系,降序排列各元素的索引,并返回排序后的索引。如列表a为[3,4,2,5,1],排序后得到的索引列表b为[3,1,0,2,4]。
#读取n个数据依次存储到列表a中
b=[i for i in range(n)]
end=0
while end  last=n-1
        
  end=last
方框中应填入的代码为(  )
A.for j in range(1,end+2):
  if a[b[j]]>a[b[j-1]]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j-1
B.for j in range(n-1,end,-1):
  if a[b[j]]>a[b[j-1]]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j
C.for j in range(1,end+2):
  if b[j]>b[j-1]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j-1
D.for j in range(n-1,end,-1):
  if b[j]>b[j-1]:
    b[j],b[j-1]=b[j-1],b[j]
    last=j
答案 B
解析 b中初始数据为[0,1,2,3,4],while循环控制循环控制比较的轮次。第1轮需要将所有数据均比较一遍,则内循环范围为0~n-2或1~n-1,由于end的初始值为0,则选项A和C不符合要求。将a中的数据降序排列各元素的索引,则进行比较时,需要根据b中的索引找到a中的对应值进行比较,即a[b[j]]和a[b[j-1]]进行比较,则排除掉选项D。

展开更多......

收起↑

资源列表