2025届信息技术一轮复习练习:专题6 简单算法及程序实现(含答案)

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

2025届信息技术一轮复习练习:专题6 简单算法及程序实现(含答案)

资源简介

专题6 简单算法及程序实现
知识点一 枚举算法
1.在信息传递的过程中,通常会将一些敏感信息进行加密,以下是实现加密功能的Python程序段。
s=input(″明文:″)
p=″″;key=2
for ch in s:
if ″0″<=ch and ch<=″9″:
p+=str((int(ch)+key)%10)
else:
p=ch+p
print(″密文:″,p)
若输入明文为“ym587”,则输出密文为(  )
A.ym785 B.ym709
C.my709 D.my907
2.有如下Python程序段:
a=[7,4,9,4,3]
b=[0]*10
c=[0]*10
for i in a:
b[i]+=1
pa=0
for j in range(10):
for k in range(b[j]):
c[pa]=j
pa+=1
执行以上程序,数组c[0]至c[4]数据依次是(  )
A.7,9,4,4,3 B.3,4,4,7,9
C.4,4,7,9,3 D.9,7,4,4,3
3.有如下Python程序段:
a=[0]*10
s=″533774″
for i in s:
a[int(i)]=1
ans=0
n=0
i=9
while i>=0 and n<3:
if a[i]==1:
ans=ans*10+i
n+=1
i-=1
print(ans)
运行程序段后,显示的内容是(  )
A.9876 B.754
C.775 D.7754
4.有如下Python程序段:
a=[10,63,50,56,26,73,48]
flag=True;key=50;min=0
for i in a:
if i>key:
if flag or i     min=i
     flag=False
print(min)
执行该程序段后,变量min的值是(  )
A.10 B.73
C.56 D.50
5.有如下Python程序段:
s=″CixiStudent ″
f=[0]*26;t=s[4:];i=0
while iif 'A'<=t[i]<=″Z″:
i+=1
continue
elif 'a'<=t[i]<=″z″ and f[ord(t[i])-ord('a')]==0:
f[ord(t[i])-ord('a')]=1
i+=1
for i in range(26):
if f[i]==1:
print(chr(i+ord('a')),end='')
运行以上程序段后,输出的内容为(  )
A.dentu B.Student
C.tuden D.deintux
6.某小区停车场停车使用车位锁,其中私家车车位,车主可将感应器插在私家车的USB电源接口上,感应器在30~50米内发出高频信号(如图 a),当私家车靠近,车位锁自动降下解锁,车离开(20 秒后)车位锁自动升起上锁。其余为收费车位,可扫描二维码控制车位锁并收费(如图b)。
收费车位计费规则如下:停车时长不到半小时按2元计费;半小时及以上则按每小时5元计费;超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费。该停车场当日的停车记录存储在“parking.txt”文件中,文件内容如图c所示,每一行共有4项数据,用逗号分隔,每项数据分别为进(出)场时间、车牌号、进出场状态(0表示进场,1表示出场)、车位状态(0表示私家车位,1表示收费车位)。小林编写了Python程序,从该文本文件中读取所有数据,并计算该停车场当日的总收入。请完成下列问题:
图a私家车位
图b收费车位
图c
(1)私家车控制车位锁需要安装感应器,据题意,此感应器属于________(单选,填字母:A.距离传感器/B.无源电子标签/C.有源电子标签/D.红外传感器)。
(2)程序代码如下所示,加框处代码有错误,请改正。
(3)请将划线处代码补充完整。
def calT(Tin,Tout):
t1=int(Tin[11:13])* 60+int(Tin[14:16])
t2=int(Tout[11:13])* 60+int(Tout[14:16])
return t2-t1
f=open('parking.txt','r')
line=f.readline()
dic={}
price=5;total=0
while line: #当line非空(从文件读取到了数据)
car=line.strip().split(',')
if car[2]=='0' and car[3]=='1':
dic[car[1]]=car[0]

T=①________
if T<30:
     fee=2
else:
     fee=②________
total=total+fee
line=f.readline()
f.close()
print(″本日停车费总收入为:″,total)
7.某搜索引擎网站一天的访问日志数据如图a所示,现要从中提取出访问网站次数最多的IP。由于IP日志文件数据量非常大,我们可以把IP日志数据分别存储到多个小文件中,分别统计出每个小文件中出现次数最多的IP地址及次数,再对各个小文件中的数据进行汇总。统计的结果如图b所示。
(1)上述处理大数据的方法,采用的是________________思想。
(2)统计小文件中出现次数最多的IP地址的Python代码如下,在划线出补充合适的代码,实现统计功能。
def showmax(ips): #统计出现次数最多的IP地址和出现次数
dic={}
maxn=0
for i in range(len(ips)):
if ips[i] in dic:
     dic[ips[i]]+=1
     if ①________:
       maxn=dic[ips[i]]
       maxIp=ips[i]
else:
     ②________
return maxIp,maxn
with open(″temp.log″,'r') as f: #读取文件temp.log 中的IP地址
ips=[]
for line in f:
ip=line.split()[0]
ips.append(ip) #将IP地址逐行追加到列表ips中
③________ #调用showmax函数
print(″出现次数最多的 IP 是:″,a[0],″出现次数为:″,a[1])
8.先统计每个分数(0~100分)人数,再将全体学生按成绩划分ABCDE五个等级,各等级比例如下表所示,每个等级按比例乘以总人数取整,输出各个等级最低分数线。
等级 A等 B等 C等 D等 E等
比例 15% 30% 30% 20% 5%
累计比例
思考:A等是分数最高的前0.15,若总人数为500人,则A等人数为多少?那么B等多少人呢?怎么计算?完成上面表格中人数的计算表达式?程序运行结果如图所示。
等级A最低分数线是92,人数822,占比0.16 等级B最低分数线是75,人数1560,占比0.31 等级C最低分数线是60,人数1530,占比0.3 等级D最低分数线是51,人数912,占比0.18 等级E最低分数线是10,人数246,占比0.05
(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。
(2)程序中加框处代码有错,请改正。
#读取学生成绩到数组a中,代码略
n=len(a)
b=[0]*101
c=[0]*102
dj=[0.15,0.30,0.30,0.20,0.05]
for i in a:
b[i]+=1
for i in range(100,1,-1):
①________
for i in range(1,len(dj)):
dj[i]=dj[i]+dj[i-1]
djfs=[0]*5
j=100
p=101
for i in range(len(djfs)):
while
j-=1
②________
print(″等级″+chr(65+i)+″最低分数线是″+str(j)+″,人数″+str(t)+″,占比″+str(round(t/n,2)))
p=③________
9.陈老师有一批文件需要上传到校园服务器中,每个文件的信息包括文件名和文件大小,如表1所示,文件按文件名顺序依次上传。已知该服务器有n条通道,可同时传输n个文件,每条通道一次只能传输一个文件。若有通道传输完成,剩余文件按照文件名顺序进入该通道。例如:当n为3时,可同时传输3个文件,如表2所示;由表2可知,通道2最先完成,则文件4进入通道2上传,如表3所示。
表1 文件信息表
文件名 文件大小(单位:MB)
文件1 5
文件2 1.8
文件3 3.7
文件4 31
文件5 3.4
文件6 121
文件7 2
文件8 47
文件9 3.2
文件10 34
表2 通道传输数据表
传输通道 文件名 累计传输数据量(单位:MB)
通道1 文件1 5
通道2 文件2 1.8
通道3 文件3 3.7
表3 通道传输数据表
传输通道 文件名 累计传输数据量(单位:MB)
通道1 文件1 5
通道2 文件4 1.8+31
通道3 文件3 3.7
所有文件信息存储在“upload.xlsx”文件中,编写Python程序,实现按照传输完成顺序依次输出文件名和每个通道的累计传输数据量,请回答下列问题。
(1)文件信息如表1所示,若n=3,则通道1累计传输的数据量为________MB。
(2)请在划线处填入合适的代码。
import pandas as pd
def minload(upload): #计算n个传输通道中累计传输文件最小的通道
t=0
for i in range(1,n):
if upload[i][1]    ①________
return t
df=pd.read_excel(″upload.xlsx″)
file=df.values.tolist() #将df转换成二维列表file,根据表1所示,file[0]的值为[″文件1″,5]
n=int(input(″输入通道数n=″))
upload=[[″″,0] for i in range(n)] #存储传输通道中的文件名和累计传输数据量
finish=[]
for i in range(len(file)):
if ②________:
upload[i][0]=file[i][0]
upload[i][1]=file[i][1]
else:
t=minload(upload) #获取传输通道中最先完成传输的通道编号
finish.append(upload[t][0])
upload[t][0]=file[i][0]
③________
for i in range(n): #将各通道中最后传输的文件名加入输出列表中
mini=0
for j in range(n):
if upload[j][1]     mini=j
finish.append(upload[mini][0])
upload[mini][0]=″″
print(finish)
for i in range(n):#输出每个通道累计传输数据量
print(″通道″,i+1,″的累计传输数据量为:″,upload[i][1])
10.抢红包游戏:微信抢红包游戏成为了一代人的经典回忆,游戏将总金额为n的“红包”随机分配给m个玩家,红包的分配需同时满足以下规则:①所有人抢到的金额总和跟总金额n相等;②每个人至少抢到1分钱;③每个人抢到的金额随机;④每个人抢到金额大小的概率平等。
满足以上规则的最简单算法可描述为:假设总金额为n元,为使问题简单化,将总金额乘以100,此时的单位为分,使得问题在整数范围内解决。假设分发给m个人,则只需在[1,100*(n-1)]长度的范围内随机生成m-1个不重复的点,这些点将长为100*n的线段划分为m个段,每一段长度即可表示红包金额,再将每一段长度数据除以100换算为单位(元)输出。程序运行的结果如图所示:
输入红包金额:100 输入红包数量:5 红包金额:54.4,11.59,28.09,4.09,1.84 手气最佳:54.4
实现上述功能的Python程序如下,请在划线处填入合适的代码。
import random
n=int(input(″输入红包金额:″))*100
m=int(input(″输入红包数量:″))
if m>n:
print(″游戏无法继续,结束!″)
else:
f=[False]*(n+1)
for i in range (①________):
t=random.randint(1,n-1)
while f[t]:
     t=random.randint(1,n-1)
f[t]=True
②________
p=0
amax=0
s=″″
for i in range(1,n+1):
if f[i]:
    ③________
     s+=str(red/100)+″,″
     if red>amax:
       amax=red
     p=i
print(″红包金额:″+s[:-1])
print(″手气最佳:″+str(amax/100))
知识点二 在一个序列中遍历元素
1.小明想要在数字串s中寻找连续数字之和为k的子串,若有多个子串符合,则输出第一个子串。例如,s=″20220520″,k=7,则符合要求的子串为″205″。实现该功能的部分python代码如下:
i=0;j=0;sum=0
for j in range(len(s)):
sum+=int(s[j])
while sum>k:
c=s[i]
①________
i+=1
if sum==k:
print(″符合要求的子串为:″,②________)
break
划线①②处的语句是(  )
A.①sum=sum+int(c)  ②s[i:j+1]
B.①sum=sum-int(c) ②s[i-1:j+1]
C.①sum=sum+int(c) ②s[i:j]
D.①sum=sum-int(c) ②s[i:j+1]
2.有如下Python程序段:
s=input('请输入数据:')
t=s[0]
maxt=0
for i in range(1,len(s)):
if s[i]>s[i-1]:
t+=s[i]
if len(t)>maxt:
     maxt=len(t)
    ans=t
else:
t=s[i]
print(ans)
执行该程序段后,输入“12123234561”,输出的内容是(  )
A.23456 B.12123
C.34561 D.1212323
3.现有一个文档“压缩前.txt”中保存了大量的小写字母和数字,小明发现文档中有很多字母或数字是连续的,就想设计一个算法将字符串中连续的字母或数字进行压缩,如连续字符“abcd”可压缩为“a-d”,不连续的字符维持原状,例如,字符串“abcde1255hij”可压缩为“a-e1-255h-j”,并将压缩后的结果输出保存到“压缩后.txt”中。
该算法的部分Python代码如下:
def writedata(data):
#将数据data输入到″压缩后.txt″中,代码略
fp=open(″压缩前.txt″)
lines=fp.readlines()
fp.close()
for line in lines:
flag=False
ans=″″
for i in range(len(line)-1):
if :
     ans+=line[i]+″-″
     flag=True
elif ord(line[i+1])!=ord(line[i])+1:
     ①________
     flag=False
ans+=line[i+1]
②________
(1)执行程序后,当输入字符串s的值为″efg1234345hijk″时,压缩后的字符串为________。
(2)请在划线处填入合适的代码。
(3)程序中加框处代码有误,请改正。
4.在一个包含数字和其他非数字字符混合的原始数据中,提取其中的连续数字,当数据中存在多个数字串,以“,”间隔不同数字串。如字符串China86USA1HK852中包含86,1,852三个数字串。
实现该功能的程序代码如下,请将空白处填写完整。
s=″China86USA1HK852″
ans=″″;flag=False
for i in s:
if ①________:
ans+=i
②________
③________:
ans+=″,″
flag=False
print(″提取的数字有:″+ans)
5.输入一个1~99999之间正整数金额,转换成相应的大写人民币形式,处理的方式:
1)人民币大写形式分″零壹贰叁肆伍陆柒捌玖″共10个数字和″拾佰仟万″4个单位。
2)从左向右向后处理每一位数字,同时读取该位数后面的一个数字。对当前数字分0和非0两个情况进行处理,若当前位为0,不加″拾佰仟万″等单位,如102转换为壹佰零贰元。
3)最后一位数单独处理,若为0,直接在转换后的字符串后加上“元”,否则加上对应的大写数字和文字“元”。
实现该功能的程序代码如下,请将空白处填写完整。
sn=″零壹贰叁肆伍陆柒捌玖拾佰仟万″
s=input(″输入一个大于0但小于10万的正整数:″)
ans=″″
for i in ①________:
t1=int(s[i])
t2=int(s[i+1])
if t1!=0:
jedx=sn[len(s)-2+10-i]
ans+=sn[t1]+ jedx
②________:
ans+=sn[0]
③________
if t1!=0:
ans+=sn[t1]
print(″转换的大写形式为:″+ans+″元″)
6.有n个人,其能力值依次存储在数组a中,若要从这些人中找出连续k个人,且要求这些人的能力之和最大。算法描述如下:
1)依次对每个人但不包含自己的前面所有人能力进行求和。
2)从前往后依次找出n个人一段的差值,该差值就是这n个人的和。
如数列1,3,2,5,6,对应的和依次为0,1,4,6,11,17,3人一组,依次为6,10,13。
程序运行的结果如图示:
(1)若a中能力值依次为7,4,9,4,8,要找出3人一组,则最高平均得分为________。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
a=[7,4,9,4,14,4,19,24,34,19,44,34,9,4,34,39,4,3]
k=int(input(″请输入人数:″))
n=len(a)
b=[0]*(n+1)
for i in range(n): #b[i]存储第i个人(不包含第i个人)前面所有人能力之和。
b[i+1]=①________
amax=0;p=-1
for i in range(②________):
t=③________
if t>amax:
amax=t
p=i
print(″平均得分最高的为″,round(amax/k,1),″开始号码是:″,str(p+1))
7.在一个整数序列中,由若干个连续的数据元素组成的序列,称为该序列的子串。现输入一个整数序列和一个整数m,寻找一个满足下列条件的子串:
1)该子串的各元素之和不能超过m。
2)在所有满足条件1)的子串中寻找长度为最大(元素个数最多找出最右边)的子序列。
例如,整数序列为″3,1,5,8,1″,m的值为10,从右边开始,将他后面的数进行累加,得到序列18,15,14,9,1。用两个数进行相减可以得到9-0和18-9符合小于10的条件。程序运行的结果如图所示:
输入不能超过的阈值:30 最长的子序列长度为:6 符合条件的最长子序列为:5,4,2,13,1,5
(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。
(2)程序中加框处代码有错,请改正。
#读取序列中数值,保存到数组d中,并输出,代码略。
m=int(input(″输入不能超过的阀值:″))
ssum=[0]*(n+1)
for i in range(①________,-1,-1):
ssum[i]=ssum[i+1]+d[i]
maxn=0
maxposi=-1
for i in range(n-1,0,-1):
j=i-1
while j>=0 and ②________:
j-=1
if i-j>maxn:
maxn=i-j
  
print(″最长的子序列长度为:″,str(maxn))
ans=″符合条件的最长子序列为:″
for i in range(③________):
ans+=str(d[i])+″,″
print(ans[:-1])
8.某数据压缩方法描述如下:
①原始数据中,某数不为0且相邻无重复,压缩数据用该数据表示;②原始数据中,某数为0且相邻无重复,压缩数据用两个数表示,第1个为0,第2个为0;③原始数据中,某数据相邻有重复,压缩数据用3个数表示:第1个为0,第2个为重复数的个数,第3个为该数本身。
根据上述压缩方法,对应的解压缩方法示例如图所示。
压缩前的代码存储在″压缩数据.txt″文件中,每两个压缩数据间用逗号分隔。编写该文件每行的数据解压缩的Python程序代码。
(1)如果压缩数据为“23,0,21,66,0,0,77,0,5,0”,则解压缩数据的个数是________。
(2)实现上述功能的Python程序如下。请在划线处填入合适代码。
def jy(a):
s=″″
i=0
while iif a[i]==″0″:
     if ①________:
       s+=″0″+″,″
       i+=2
     else:
       for j in range(int(a[i+1])):
         s+=a[i+2]+″,″
       ②________
else:
     s+=a[i]+″,″
     i+=1
return s[:-1]
f=open(″压缩数据.txt″,″r″,encoding=″utf-8″)
for i in f:
s1=i.split(″,\n″)
③________
print(s2)
9.正常单词不会有连续2个以上相同的字母,如果出现连续3个以上的字母,那么这是一个抽搐词。给出该单词,从左到右求出所有抽搐词字母的起始点和结束点。如输入字符串“whaaaaatttsup”输出为“3-7,8-10,”,输入“whoooisssbestttt”输出为“3-5,7-9,13-16”。
程序代码如下所示,请回答下列问题。
(1)若将字符串“schhhoolhommeeee”作为输入单词,则按以下代码执行后的输出为________。
(2)在划线处填上合适的代码。
s=input(″请输入一个单词:″)
n=①________
c=s[0];k=1
for i in range(1,n):
if c==s[i]:
k+=1
else:
if k>=3:
     print(str(i-k+1)+″-″+str(i),end=″,″)
k=1
②________
if k>=3:
print(str(i-k+2)+″-″+str(i+1))
10.创意机器人大赛——捡硬币。比赛规则如下:
(1)在比赛场地上放置了n个硬币,每个硬币的位置均不相同,各位置坐标(x,y)保存在文本文件中(如图a所示,放置了5个硬币,文本中坐标按x,y升序排列);
(2)机器人在两个硬币位置间走直线,从起点(0,0)出发,按硬币x坐标从小到大去捡,若x坐标相同,则按y坐标从小到大捡;取走其中的n-1个硬币,总行走距离最短的机器人将获得比赛的冠军。
例:如图a所示,p2直接到p4则代表p3处硬币未取。
完成该项目分以下几个步骤:
(1)读取坐标数据。
从文本文件中读取硬币的坐标(x、y),分别存储在列表x和y中。请在划线处填入合适的代码。
f=open(″position.txt″,'r') #从文件中读取坐标位置
x=[0];y=[0] #将原点坐标分别存储在x、y列表中
line=f.readline() #取出一行数据
#从文本文件中读取硬币的位置,并存储在x、y列表中
while line:
data=line.split(″,″) #以逗号为分隔符转换成列表
x.append(int(data[0]))
①________
line=f.readline()
f.close()
(2)编写函数,计算两点间的距离。请在划线处填入合适的代码。
from math import sqrt
def dist(x1,y1,x2,y2): #计算(x1,y1)到(x2,y2)的距离
d=②________
return d
(3)设计算法与程序实现。
机器人取走n-1个硬币经过的最短距离公式可以描述为:
其中:为机器人取走n-1个硬币走的最短距离;为机器人取走n个硬币经过的距离之和;为机器人未取第i个硬币少走的路程;Max为求中的最大值。
根据上述算法编写的Python程序如下,请在划线处填入合适的代码。
n=len(x);long=0
for i in range(1,n):
long=long+dist(x[i-1],y[i-1],x[i],y[i])
ansi=n-1
for i in range(2,n):
d1=dist(x[i-2],y[i-2],x[i-1],y[i-1])
d2=dist(x[i-1],y[i-1],x[i],y[i])
d3=dist(x[i-2],y[i-2],x[i],y[i])
dx=③________ #计算未取第i-1 个硬币少走的路程。
if dx>maxd:
maxd=dx
ansi=i-1
print(″机器人行走的最短距离为:″+str(round(④________,4)))
print(″未取走的硬币的位置为:(″,x[ansi],″,″,y[ansi],″)″)
(4)调试和异常处理。
当最后一个硬币未取为最短距离时,上述程序运行结果不正确。加框处代码有误,请修改。
11.根据2012年出台的气象行业标准,滑动平均气温可以作为入春的划分指标。滑动平均气温值是以当天和前4天这5个日平均气温数据为一组求取的平均值,当滑动平均气温值连续5天大于等于10 ℃且小于22 ℃,才算入春。
从计算这5个滑动平均气温值所对应的9天日平均气温数据中,选取第一个大于等于10 ℃且小于22 ℃的日期,作为春季起始日。小明收集了3~4月份的部分气温数据,编写Python程序确定入春时间。请回答下列问题。
(1)若3月8日起的天气数据如下表所示,根据滑动平均气温标准,春季起始日为________号。
日期 8 9 10 11 12 13 14 15 16 17 18 …
日平均 气温 7.5 9.5 12.5 9 12 11 13.5 10.5 10 7 7.5 …
滑动平 均气温 6.1 5.7 7.2 8.7 10.1 10.8 11.6 11.2 11.4 10.4 9.7 …
(2)编写Python程序,读取某段时间内的温度数据,判断是否入春,输出结果如图所示。实现上述功能的Python程序如下,请在划线处填入合适的代码。
wd=[[″3月1日″,10,4],
[″3月2日″,15,4],
………………
[″4月3日″,11,9],
[″4月4日″,14,10]] #列表wd存储日期及每日的最高、最低气温
a=[7,9.5,8,9.5] #列表a存储日平均气温,已保存前4天数据
b=[8.2,7.7,7.5,8.2] #列表b存储滑动平均气温,已保存前4天数据
n=0
he=34 #变量he已保存前4天(1至4号)日均气温之和
for i in range(4,len(wd)): #从第 5 天开始计算
a.append((wd[i][1]+wd[i][2])/2)
he+=a[i]
b.append(he/5)
①________
i=0
flag=True
while ifor j in range(i,i+5):
if b[j]<10 or b[j]>=22:
     break #跳出当前循环
else:
for x in range(i-4,i+5):
     if 10<=a[x]<22:
       print(②________+″入春″)
       flag=False
       break
i=i+1
if ③________:
print(″还未入春″)
12.一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则称为该序列为摇摆序列。小王同学想求出某个数列的最长摇摆子序列。以序列[3,14,7,6,9,12,10,8,13,5]为例,整体不是摇摆序列,但子序列[3,14,7,9]、[3,14,6,12]等都属于摇摆子序列,其中最长的摇摆子序列是[3,14,6,12,8,13,5]。根据图a分析得知,当序列有一段连续的递增(或递减)时,可形成摇摆子序列,我们只需要找到每一次转折中的拐点元素。小王编写了一个Python程序实现该功能:程序运行时,输入一串用逗号分隔和结束的数字,可以得到最长摇摆序列的长度,以及具体的序列。程序运行界面如图所示:
请输入以逗号分隔和结束的数据(不超过20个数):3,14,7,6,9,12,10,8,13,
最长摇摆子序列为:6
最长摇摆子序列为:3,14,6,12,8,13
(1)若输入数据“2,4,5,3,2,1”,则最长摇摆子序列为________。
(2)实现上述功能的Python代码如下,请在划线处填入合适的代码。
s=input(″请输入以逗号分隔和结束的数据(不超过20个数):″)
a=[0]*20;b=[False]*20;flag,n,i,t,ans=0,0,0,'',''
def f(n):
f=1
global ans #global表示此处的ans就是全局变量ans
ans=str(a[n-1])
for i in range(n-2,-1,-1):
if b[i]:
     f=f+1
     ①________
return f
for ch in s:
if ch==″,″:
a[i]=int(t);n+=1;i+=1;t=''
else:
t=t+ch
for i in range(1,n):
gd=True
if flag==0:
if a[i]>a[i-1]:
     flag=1
elif a[i]     flag=2
else:
    gd=False
elif flag==1 and a[i]flag=2
elif ②________:
flag=1
else:
gd=False
③________
if f(n)<3:
print(″不构成摇摆子序列″)
else:
print(″最长摇摆子序列长度为″,str(f(n)))
print(″最长摇摆子序列为:″,ans)
13.为了让乘客实时掌握公交到站时间,提高乘客的出行体验,某公交公司开发了一款小程序,其主要功能有:乘客输入当前时刻和上下站点序号,可以查询到最近到达班次、候车时间及预计乘车时间。某线路的部分发车信息存储在文件″gj.csv″中时刻表如表所示:
站点序号 班次1 班次2 班次3 班次4 班次5
1 7:20 8:00 8:30 9:00 9:30
2 7:24 8:06 8:38 9:05 9:38
3 7:28 8:13 8:48 9:15 9:44
4 7:32 8:15 8:54 9:20 9:50
5 7:35 8:17 9:00 9:24 10:00
6 7:37 8:20 9:05 9:28 10:17
7 7:40 8:24 9:13 9:30 10:25
8 7:43 8:28 9:18 9:40 10:35
9 7:50 8:30 9:25 9:43 10:55
10 8:00 8:40 9:40 10:00 11:09
程序运行效果如图所示:
乘客您好!请输入当前时刻:7:21 请输入上车站点:2 请输入下车站点:8 最近到站的公交为第1班次,候车时间为3分钟,预计您的乘车用时为19分钟。
(1)如果当前时刻是9:18,从站点4上车,站点10下车,预计乘车用时为________分钟。
(2)实现上述功能的部分程序如下,请在划线处填上合适的代码。
import csv
f=open(″gj.csv″,″r″)
f_csv=csv.reader(f)
time=[]
for row in f_csv:
time.append(row)
def change(times): #转换时间的单位为分钟,参数 times 如“6:00”
#times.split(':')表示将字符串 times 按照':'进行分割,返回结果为列表
hours=times.split(':')[0]
minutes=times.split(':')[1]
res=①________
return res
for i in range(1,len(time)): #将公交时间表中的时刻统一转为分钟单位
for j in range(1,len(time[i])):
time[i][j]=change(time[i][j])
now=change(input(″乘客您好!请输入当前时刻:″))
p1=int(input(″请输入上车站点:″))
p2=int(input(″请输入下车站点:″))
n=len(time[0])-1
min=time[p1][1]-now
k=1
for i in range(②________):
if time[p1][i]-nowmin=time[p1][i]-now
k=i
tot=④________
print( ″最近到站的公交为第″+str(k)+″班次,候车时间为″+str(min)+″分钟,预计您的乘车用时为 ″+str(tot)+″分钟。″)
知识点三 组合问题
1.有如下Python程序段:
a=[3,6,4,1,2,5]
n=len(a)
f=[False]*n;p=[0]*6
for i in range(6):
k=0
for j in range(1,n):
if f[j]==False:
     if f[k]==True or a[j]>a[k]:
       k=j
p[i]=k
f[k]=True
程序执行后,列表p的值依次是(  )
A.[0,1,2,3,4,5] B.[5,4,3,2,1,0]
C.[1,5,2,0,4,3] D.[4,0,2,5,4,1]
2.有如下Python程序段:
#生成6个随机整数,存入列表元素a[0]到a[5]中,代码略
b=[0]*6
for i in range(1,6):
for j in range(i):
if a[i]>a[j]:
     b[i]+=1
print(sum(b)) #计算并输出数列b中所有元素之和
执行该程序段后,输出的结果是6,则a[0]到a[5]各元素值可能的是(  )
A.10,17,33,28,49,30 B.14,36,21,37,11,19
C.46,33,50,47,13,34 D.33,24,34,11,31,43
3.有如下Python程序段:
s=[″56″,″174″,″81″,″213″,″143″,″9″]
m=[1]*len(s)
for i in range(len(s)):
for j in range(len(s)):
if s[i]     m[i]+=1
print(m[2])
执行程序后,输出的结果为(  )
A.2 B.1 C.3 D.4
4.哥德巴赫猜想是近代三大数学难题之一,即任一大于2的偶数,都可表示成两个素数之和。采用Python验证100以内哥德巴赫猜想的正确性,则划线处的代码为: (  )
import math
def isprime(num):
i=2
while i<=int(math.sqrt(num)):
if num % i==0:
     return False
i+=1
return True
n=6
while n<=100:
for j in range(3,int(n/2)):
if____(1)____:
     print (n,″=″,j,″+″,n-j)
n+=2
A.isprime(j) and isprime(n-j)
B.isprime(j) and isprime(j+1)
C.isprime(n) and isprime(j)
D.isprime(j) and isprime(j-1)
5.小温用Python编写一个统计学生选考科目的程序,用于检查每位学生选课组合是否有效(选课组合为3门且不重复),并对有效选择结果统计每个科目的选课人数及选课率(选课率=选考人数/选课有效总人数)。学生选课信息存储在choose.txt文件中,其中subject列的数据为学生的选课科目数据,均以科目代码显示。科目名称与科目代码的对应关系如下表:
科目名称 物理 化学 生物 政治 历史 地理 技术
科目代码 0 1 2 3 4 5 6
choose.txt文件的部分界面及程序运行结果分别如图a、图b所示。
(1)文件choose.txt中的数据为________(单选,填字母:A.结构化数据/B.半结构化数据/C.非结构化数据。)
(2)请在划线处填入合适代码。
def check(x): #检测选课组合是否有效
flag=False
sum,lista=0,[0]*7
if len(x)==3:
for i in range(3):
     if ″0″<=x[i]<=″6″:
       lista[int(x[i])]=1
for i in range(7):
     sum+=lista[i]
     if①________:
       flag=True
return flag
dict={0:″物理″,1:″化学″,2:″生物″,3:″政治″,4:″历史″,5:″地理″,6:″技术″}
f=open(″choose.txt″,″r″)
line=f.readline()
num,listn=0,[0]*7
while line !=″″:
listb=line.strip().split(″,″)
s=listb[3]
if check(s):
for i in range(3):
     listn[int(s[i])]=②________
num+=1
line=f.readline()
f.close()
print(″科目″,″人数″,″选课率″)
for i in range(7):
③________
print(dict[i],″{:<4d}″.format(listn[i]),″{:.2%}″.format(k)) #″{:<4d}″.format(listn[i])作用为将listn[i]左对齐输出(宽度为4)
#″{:.2%}″.format(k)作用为将k以百分比格式输出(保留2位小数)
6.某市要组织高中生参加竞技比赛。现要求在报名的n名学生中挑选出身高大于等于175 cm的学生,被挑选出的学生两两组队,且队内两名成员的体重之和不能超过140公斤,找出最多的组合数量。(提示:在符合身高要求下,按体重降序排列,体重最大的和体重最轻的组合,达到组合数量最多。)
实现上述功能的Python程序如下,请在划线处填上合适的代码。
#将学生的姓名,身高和体重依次存储到数组a中,代码略
n=len(a)
for i in range(n-1):
for j in range(n-1,i,-1):
if a[j][2]>a[j-1][2] and (a[j][1]>=175 and a[j-1][1]>=175):
    a[j],a[j-1]=a[j-1],a[j]
elif ①________:
     a[j],a[j-1]=a[j-1],a[j]
if a[i][1]<175:
nlen=②________
break
i=0;j=nlen
while iif a[i][2]+a[j][2]<=140:
print(a[i],a[j])
i+=1
j-=1
else:
③________
7.公因数只有1的两个非零自然数,叫做互质自然数。王老师编写了一个Python程序,程序的功能是随机产生5个1到20之间的整数,找出其中和最大的互质数对。程序运行界面如图所示:
实现该功能的程序代码如下:
import random
def gcd(a,b): #gcd函数的作用是求a和b的最大公因子
while a%b !=0:
a,b=b,a%b
return b
a=[]
for i in range(5):
a.append(①________)
print(″产生的 5 个随机数是:″,a)
max=0 ;result=″″
for i in range(len(a)):
for j in range(i+1,len(a)):
if ②________and a[i]+a[j]>max:
     max=a[i]+a[j]
     result=str(a[i])+″ ″+str(a[j])
if result !=″″:
print(″最大的互质数对是:″,result)
else:
print(″找不到互质数对″)
请回答下列问题:
(1)寻找互质数对的算法属于________(选填:枚举/解析)算法。
(2)如产生的5个随机数是[20,16,12,6,14],则程序输出内容是________。
(3)要实现程序的功能,请完善划线处的代码。
8.小明编写一个Python程序,实现找到字符串s1和s2中相同的最长子串s,并定位子串在字符串s2中出现的位置,运行结果如图所示。
s1:Python s2:thanks thanks thanks 最长共同子串:th 子串出现位置: 0/7/14/
(1)如输入s1和s2分别为“hello”和“hi”(不含引号),输出最长共同子串是________。
(2)定义longstr函数,功能是找到字符串s1和s2中相同的最长子串,请在划线处填入合适的代码。
def longstr(s1,s2):
m=[[0]*(1+len(s2)) for i in range(1+len(s1))]
t,h=0,0
for i in range(1,1+len(s1)):
for j in range(1,1+len(s2)):
    if ①________:
       m[i][j]=m[i-1][j-1]+1
       if m[i][j]>t:
         t=m[i][j]
         ②________
     else:
       m[i][j]=0
return s1[h-t:h]
(3)定义pos函数,功能是定位子串在字符串s2中出现的位置,请在划线处填入合适的代码。
def pos(st,s2):
print(″子串出现位置:″)
start=0
if len(st)>0:
while True:
     start=s2.find(st,start) #返回字符串 s2 中子串 st 出现的首字符索引,从索引 start 开始找,若找不到,则输出-1
     if start==-1:
       break
     print(start,end=″/″)
     ______________
(4)主程序,请在划线处填入合适的代码。
s1=input(″s1:″)
s2=input(″s2:″)
s=____________
print(″最长共同子串:″,s)
pos(s,s2)
综合题 简单算法
1.用英文字母A~D对数字字符0~9进行编码,规则如表所示:
数字字符 0 1 … 7 8 9
二进制值 0 0 0 0 0 0 0 1 … 0 1 1 1 1 0 0 0 1 0 0 1
十进制值 0 0 0 1 … 1 3 2 0 2 1
对应编码 A A A B … B D C A C B
(1)输入等加密的数字串为74,则输出的加密结果为________。
(2)实现上述功能的部分 Python 程序如下,请在划线处填入合适的代码。
code=″ABCD″
s=input(″输入待加密的数字串:″)
ans=″″
flag=True
for x in s:
if ①________:
t=int(x)
②________
t2=t%4
ans+=code[t1]+code[t2]
else:
③________
if flag:
print(″加密后的结果:″+ans)
else:
print(″输入非法数字!″)
2.数据在网络传输中,带宽是宝贵的资源,通过压缩传输的字符串,可以减少数据量,从而加快传输速度,节省带宽资源。现有一种字符压缩方法描述如下:对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D是一个整数且1≤D≤99),如字符串“ABABABAB”就压缩为“[4AB]”或者“[2[2AB]]”,类似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2AB]]]”则是三重的。现给出一串压缩后的结果,并对其进行解压缩。
思路:先找出每个左括号的位置,然后从后往前枚举,找出每一个括号内要解压的子串以及要解压的次数,将子串解压后得到一个新串,重复操作,得到最终的解压缩结果。
例如:[2[2[2AB]]]→[2[2ABAB]]→[2ABABABAB]→ABABABABABABABAB。
(1)已知采用上述压缩方法得到的压缩结果是“[2Z[2DB]]”,则解压缩结果为________。
(2)根据上述描述,小明利用Python设计了一个解压缩程序,请在划线处填入合适的代码。
start=[]
s=input(″请输入压缩结果:″)
for i in range(len(s)):
if s[i]==″[″:
start.append(i)
for i in range(len(start)-1,-1,-1):
num=0;temp=″″
①________
while jif ″0″<=s[j]<=″9″:
     num=num*10+int(s[j])
else:
     ②________
j+=1
ans=num*temp
s=s[:start[i]]+③________ #重新构造字符串
print(″解压结果为:″+s)
3.腾讯通过QQ等级来衡量用户的活跃情况。QQ等级计算规则如下:
①用户当天在线两个小时,记为活跃1天;半小时及以上、两小时以下则记为活跃0.5天。
②根据累计活跃天数对应不同QQ等级,如表所示,0级至1级需活跃5天,1级至2级需活跃7天,依此类推。
③每升1级,用户可以获取1个△,4个△兑换1个◇,4个◇兑换1个○,4个○兑换1个☆。
级别 图标 累计活跃天数
0级 0天
1级 △ 5天
2级 △△ 12天
3级 △△△ 21天
4级 ◇ 32天
5级 ◇△ 45天
(1)小张的QQ等级图标为○◇◇◇△△,则小张QQ等级的级别是________。
(2)“log.txt”文件中逐行记录了某位用户每天的在线时长(以小时为单位),编程实现读取文件内容并计算,按☆○◇△的顺序输出用户的QQ等级图标,请在划线处填入合适的代码。
f=open('log.txt')
data=[]
active=0
icon=[″☆″,″○″,″◇″,″△″]
#逐行读取'log.txt'文件中的数据,依次添加到data列表中,如data=[1.9,2.3,11.5,3.1,2.8,5.2……]代码略
#计算用户的活跃天数
for i in range(len(data)):
if data[i] >=2:
active +=1
elif data[i] >=0.5:
    ①________
#计算用户等级
base=5
level=0
while active >=base:
level +=1
②________
base=base + 2
#将等级换算为图标
s=″″
while level !=0:
r=level%4
s=str(r)+s
③________
n=len(s)
ans=″″
start=4-n
for i in range(n):
ans +=④________
print(ans)
4.三阶幻方又叫九宫格,是由 1,2,3,4,5,6,7,8,9 九个数字组成的一个三行三列的矩阵,其对角线、各行、各列的和都为15,如图所示。
4 9 2
3 5 7
8 1 6
罗伯法(又称为楼梯法)可以构造所有奇数阶幻方。首先把1放在第一行正中,然后按如下规则依次放置剩下的n*n-1个数,具体步骤为:
(1)当前数要放的位置P优先考虑前一个数的右上一格(行号减1,列号加1)
(2)若位置P出了上界(行号超出了顶行),则将其放在底行(行号为n-1)
(3)若位置P出了右界(列号超出了最右列),则将其放在最左列(列号为0)
(4)若位置P已有数字或行列号均出界,则将其放在前一个数的下一格(行号加1,列号不变)
实现上述功能的Python程序如下,请在划线处填入合适的代码。
def odd_magic_square(n):
a=[[0]*n for j in range(n)]
i,j=0,n//2
for num in ①________:
a[i][j]=②________
i-=1
j+=1
if i<0 and j     ③________
elif i>=0 and j>=n: #出右界
     j=0
elif (i<0 and j>=n) or a[i][j]!=0:
     ④________
     j-=1
return a
size=int(input(″请输入奇数阶幻方数:″))
a=odd_magic_square(size)
for i in range(size):
for j in range(size):
print(f″{a[i][j]:3}″,end=″″)
print()
5.现有一个由n位大写字母组成的密码串,将其分成m段长度相同的子密码串,已知n是m的倍数。小明编写了一个Python程序,输入密码串和正确的子密码串,检查这m段子密码串的正确情况。若子密码串与正确的子密码串不完全相同,则该子密码串错误,需指出错误字符在该子密码串中的位置。例如,密码串为“ABCDEFGABBDKFGABCDEFKABCDGFG”,正确的子密码串为“ABCDEFG”,则检查结果如图a所示,程序运行界面如图b所示。
(1)密码串为“ACDEFACDEEABDEFACDFF”,正确的子密码串为“ACDEF”,则有________段子密码串错误。(填:阿拉伯数字)
(2)实现上述功能的Python程序如下,请在程序划线处填入合适的代码。
pwst=input(″请输入密码串:″)
pwsubst=input(″请输入正确的子密码串:″)
n=len(pwst)
p=len(pwsubst)
m=n//p
errinfo=[″″]*m
cnt=0
for i in range(m):
j=0
①________
flagp=0;info=″″
while ②________:
if pwst[k]!=pwsubst[j]:
     flagp+=1
     info=info+″ ″+str(j+1)
j+=1
k+=1
if flagp>0:
③________=″第″+str(i+1)+″段错误!错误位置:″+info
    cnt+=1
print(″共有″,cnt,″段错误″)
for i in range(cnt):
print(errinfo[i])
6.在一个正整数序列中,由若干个连续的数据元素组成的序列,称为该序列的子序列。现输入一个整数序列和一个整数m,寻找一个满足下列条件的子序列:
①该子序列的各元素之和不能超过m。
②在所有满足条件①的子序列中寻找长度为最大(元素个数最多)的子序列。若满足条件的子序列有多个,则输出最左边的子序列。
例如,整数序列为“1,5,4,2,3,1,5,8,1”,m的值为15,则元素之和不超过m的最长子序列有“[1,5,4,2,3]”和“[4,2,3,1,5]”,长度均为5,根据题目要求可知,最后输出的最长子序列为“[1,5,4,2,3]”。读入一个由整数组成的数据序列,输入m,输出符合条件的最长子序列及该子序列的长度。程序运行界面如图所示。
序列为:[1,5,4,2,3,1,5,8,1] 请输入m的值:15 最长子序列长度为:5 最长子序列为:[1,5,4,2,3]
请回答下列问题:
(1)若原序列为“3,5,4,5,2,3,1,8,3,4”,m=20,则输出的最长子序列为________。
(2)函数sumif(b)的功能是求列表b中元素的前缀和,即sumx[1]=b[0],sumx[i]=b[0]+...+b[i-1],请在程序划线处填入合适的代码。
def sumif(b):
sumx[0]=0
for i in range(1,n+1):
sumx[i]=①________
return sumx
(3)主程序如下,请在程序划线处填入合适的代码。
#读入数据,并存入列表 d 中,代码略
print(″序列为:″,d)
n=len(d)
m=int(input(″请输入 m 的值:″))
sumx=[0]*(n+1)
sumx=sumif(d)
maxn=0
maxposi=-1
for i in range(0,n+1):
j=i
while ②________:
j=j+1
if j-i-1>maxn:
③________
maxposi=i
print(″最长子序列长度为:″,maxn)
print(″最长子序列为:″,d[maxposi:maxn+maxposi])
7.最小覆盖子串。输入一个字符串s、一个字符串t,从左往右遍历字符串s,返回s中涵盖t所有字符的最小子串。如果s中存在多个最小子串,则输出第一次出现的子串,如果s中不存在涵盖t所有字符的子串,则输出“找不到覆盖子串”。
注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。示例1:输入:s:ADOBECODEBANC
t:ABC
输出:BANC
实现上述功能的Python程序代码如下,请回答下列问题。
(1)若s=″ADOBECODEBANC″,t=″ABBC″,则结果为________。
(2)请在程序划线处填入合适的语句。
编写自定义函数count,采用字典dic统计字符串t中各个字母出现的次数。
def count(t):
dic={}
for i in t:
if i in dic:
     ①________
else:
     dic[i]=1
return dic
编写自定义函数check,检测字典dic2中字母有没有覆盖字典dic1中的字母
def check(dic1,dic2):
for zm in dic1:
if zm not in dic2 or ②________:
     return False
return True
主程序
s=input(″s:″)
t=input(″t:″)
f=False
length=len(t)
dic_t=count(t)
while length<=len(s):
start=0
for i in range(start,len(s)):
③________
dic_temp=count(temp)
if check(dic_t,dic_temp):
     print(″找到的第1个最小子串是:″,temp)
     f=True
     break
if f==True:
break
else:
④________
if f==False:
print(″找不到覆盖子串″)
8.随机生成一个仅由大写字母″X″″Y″″Z″组成长度为 n 的字符串,消除该字符串连续3个及以上的相同字符。例如,字符串″XZZYYYYZYZ″,第一步:消除字符4个″Y″,得到新字符串″XZZZYZ″;第二步:消除3个字符″Z″,得到新字符串 ″XYZ″。实现上述功能的Python程序如下,请回答下列问题:
(1)如有字符串“XYYYXXZZY”,则消除后,字符串为:________。
(2)请在程序划线处①②③④填入合适的代码,实现程序功能。
import random
def left(s,x): #查找与s[x]连续相同的最左边位置
while ①________:
x=x-1
return x
def right(s,x): #查找与s[x]连续相同的最右边位置
while ②________:
x+=1
return x
n=int(input(″请输入字符串的长度:″))
s=″″
for i in range(n): #随机生成一个长度为n的字符串
m=random.randint(0, 2) #
③________
print(″生成的字符串为: ″,s)
i=0
while iL=left(s,i)
R=right(s,i)
if ④________:
s=s[:L]+s[R+1:]
⑤________
else:
i+=1
print(″最后的字符串为: ″,s)
9.世界卫生组织认为成年人正常血压标准:收缩压在90-140之间并且舒张压在60-90之间(包含端点值)。现有监测到的连续若干天的血压值,编程计算正常血压持续的最长天数并输出起止日期,若有多段最长天数,则输出最后一段的起止日期。
(1)某段时间测量的血压值如图所示,则正常血压持续的最长天数为________。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
″'
数组a中保存每天监测到的血压值,a[2*i]和a[2*i+1]分别表示第i天的收缩压和舒张压,数组b保存日期数据,代码略;
日期 收缩压 舒张压
9月1日 130 93
9月2日 132 87
9月3日 133 85
9月4日 128 78
9月5日 152 91
9月6日 125 86
″'
n=len(a)
t,ans,end=0,0,0
for i in range(n//2):
if 90<=a[2*i]<=140 and 60<=a[2*i+1]<=90:
t+=1
if ①________:
     ans=t
     end=i
else:
②________
print(″正常血压持续的最长天数为:″,ans)
beg=③________
print(″起止日期:″,b[beg],″--″,b[end])
10.猜数游戏。游戏规则如下:设定一个秘密数,每猜错一次会得到格式为“iAjB”的提示,其中“iA”表示数字猜对且位置也猜对的数有i个,“jB”表示数字猜对但位置没猜对的数有j个。例如秘密数为“2507”时,若猜测数为“1702”,则提示是“1A2B”。
(1)现已知秘密数为“37692”,猜测数为“79612”,则提示是________。
(2)上述功能的部分Python程序如下,请在划线处填入合适的代码。
#将设定的秘密数存放于变量s中
while True:
g=input()
if g==s:
print(″猜对了″);break
i=A=B=0
cnt1, cnt2=[0] * 10, [0] * 10
while iif ①__________ :
     A+=1
else:
     cnt1[int(s[i])]+=1
     ②________
i+=1
for j in range(10):
m=min(cnt1[j],cnt2[j])
③________
print(″提示:″,str(A)+″A″+str(B)+″B″)
11.已知某年级有6个班级,所有学生名单存储在文件“name.csv”中(如图1),学校举行某趣味活动项目中,需要每个班抽3名代表参加比赛,请编写一个随机抽取程序,执行效果如图2。请回答以下问题:
(1)加框处代码的作用是________。
(2)实现上述功能的部分Python程序如下,请在划线处填写合适的代码。
import csv
import random
#数据读入
f=open(″name.csv″,″r″)
flines=csv.reader(f)
name_list=[]
m=6 #班级总数
total=18 #参赛总人数
for line in flines:
if line[0]==″班级″: continue #跳过当前循环的剩余语句,继续进行下一次循环
name_list.append(line)
①________
flag=[False]*n
grade=[3]*m
i=0
while ip=random.randint(②________,③________)
bj=int(name_list[p][0])
if flag[p]==False:
if grade[bj-1]>0:
    flag[p]=True
     ④________
     i+=1
print(″抽取名单为:″)
print(″班级″,″姓名″)
for i in range(n):
if flag[i]:
print(name_list[i][0],name_list[i][1])
12.对某二值图像(颜色编号只有0、1)按如下规则对其进行数据压缩:
(1)记录原数据第1个位置的颜色编号;
(2)从左往右依次扫描颜色编号,统计并记录连续出现的相同颜色编号个数:
例如:图像的颜色编号压缩结果为“0, 9, 8, 3”(用逗号分隔)
请回答下列问题:
(1)若某二值图像按此规则压缩的结果为“1,1,3,5,6”,则该图像的颜色数据中有________个1。
(2)定义如下jys(s)函数,参数s存储压缩结果,为字符串类型,如“0, 9, 8, 3”。函数功能是实现数据解压缩,函数以字符串类型返回原数据。请在划线处填入合适的代码。
def jys (s) :
d={″1″:″0″,″0″:″1″}
①________
ns=″″;p=s[0] ; i=2
while i < n:
num=0
while ②________:
     num=num*10 + int(s[i])
     i+=1
i+=1
for j in range (num) :
     ③________
p=d[p]
return ns
13.数组a中存储的是左右交替上升的n个正整数,如程序中数据所示。依据对分查找思想,设计一个在数组a中查找数据key的程序。
a=[3,25,38,42,45,39,31,12]
n=len(a)
key=int(input(″输入要查找的数:″))
i=0
j=①________
flag=False
while :
m=(i+j)//2
if key==a[m]:
flag=True
elif keyj=m-1
else:
i=m+1
if not flag and j>=0:
②________
if a[m]==key:
flag=True
if flag:
print(key,″找到了,位置为″,m+1)
else:
print(key,″未找到″)
(1)请在划线处填入合适的代码。
(2)加框处代码有误,请改正。
14.你是一名数据分析师,正在开发一个处理特定序列数据的应用程序,这些数据是以环状序列的形式提供的。现在需要设计一个算法,能够在这些环状序列中找出最长升序子串(若有多组最长子串,则输出最先出现那组)。例如环状序列“BCEGHBCEFGA”中最长升序子串是“ABCEGH”。程序运行界面如图所示。
请输入序列数据:BCEGHBCEFGA 最长升序长度是:6 最长升序子串是:ABCEGH
实现上述功能的程序段如下,请回答下列问题:
(1)请在划线处填入合适的代码。
(2)加框处代码有误,请改正。
s=input(″请输入序列数据:″)
n=len(s)
for i in range(n-1):
if :
break
if i==n-2:
k=n-1
maxc=n
else:
maxc=1
cnt=1
p1=i+1
p2=(p1+1)%n
while ①________ :
if s[p1]    cnt+=1
    if cnt>maxc:
      maxc=cnt
      ②________
else:
    cnt=1
p1=p2
p2=(p2+1)%n
print(″最长升序长度是:″,maxc)
s1=″″
for i in range(maxc):
s1=s[k]+s1
③________
print(″最长升序子串是:″,s1)
15.某停车场有一排连续的停车位。现在有两种类型的汽车,大型车和普通车。大型车需要2个连续的停车位,而普通车只需要1个停车位。编写程序,根据输入数据,输出空停车位数及还可以停放大型车的最多数量(不移动已停放的汽车)。输入的数据样例中e表示空车位,p表示被占用的车位。以“3e2p5e”为例,表示3个空车位,紧接着2个被占用的车位,再接着5个空车位,请回答下列问题:
(1)如果输入数据样例为“3e1p11e2p4e”,还可停放大型车最多数量为________个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
def input_data(data):
park=[] #初始化停车场模型,0表示空车位,1表示占用c=0
for ch in data: #如果字符是数字,则更新c
if ″0″<=ch<=″9″:
     ①________
else:
     if ch==″e″:
       status=0
     else:
       status=1
for i in range(c):
     park.append(status)
c=0
return park
def cal(park):
empty=0; max_cars=0; i=0
②________
while iif park[i]==0:
     empty +=1
     if i < n-1 and park[i+1]==0:
       ③________
       max_cars +=1
      i +=1
i+=1
return empty,max_cars #返回两个值
s=input(″输入数据″)
park=input_data(s)
empty,max_cars=cal(park)
print(″空停车位数:″, empty,″可停放大型车最多数量:″, max_cars)
专题6 简单算法及程序实现
知识点一
1.C [本题考查加密解密知识点的程序代码理解。数字字符循环右移2位并顺序组合,所以5→7,8→0,7→9。遇到其他字符则逆序组合得到密文。]
2.B [本题考查桶排序。第一个For循环中,语句b[i]+=1的功能是:利用桶对数组a中数据进行计数。桶的下标是有序的,对应数的值,按桶的编号输出各个桶中的数。在第二个循环中,当b[j]值大于0时,开始重复地把j的值依次放在c数组中。]
3.B [第一个for循环是统计出现的数字,如果出现过,该数对应下标的a数组值为1,否则为0,并没有统计各个数字出现的次数。接着从高位向位遍历3个数字,将出现过的数字按先后顺序拼接成一个3位整数。]
4.C [本题考查的循环结构。只有满足a(i)>Key才进行判断,找到第1个大于key的a(i)时,flag=False,min为最小数,因此是查找大于key的最小数,故答案为56。]
5.A [本题考查循环控制结构。continue语句用来告诉Python跳过当前循环,进行下一个循环。列表t中的值为'Student',f列表中有26个元素,可以看成一个桶,当某个字母出现,ord(t[i])-ord('a')对应的索引号的元素值为1,表示该字母出现过。将出现过的字母从小到大输出。]
6.(1)C (2)elif car[3]=='1' (3)①calT(dic[car[1]],car[0]) ②(T+30)//60*price或int(T/60+0.5)*price
解析 (1)接USB口能获取电源,并能主动发送信息,因此属于有源电子标签。(2)car[2]进出场状态,car[3]表示车位状态,当进场状态为0且为收费车牌时,在字典dic创建一个车牌号码为键,进场时间为值的键值对,只有收费车牌时才计算费用,而私家车是不用计费的。(3)①调用函数计算停车费用。calT函数的第1个参数为入场时间,第2个参数为出场时间,入场时间在dic字典中获取,出场时间为当前记录的时间。②计算费用。超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费,四舍五入计算整小时数,并按每小时5元计费。
7.(1)分治 (2)①dic[ips[i]]>maxn ②dic[ips[i]]=1 ③a=showmax(ips)
解析 (1)将一个大问题分解小的子问题,称为分治思想。(2)①中根据出现次数,统计出现次数最多的IP地址。②选择结构if ips[i] in dic:表示如果ips[i]已经在字典中,统计可能是最多次数,如果不在字典中,将在字母中新增一个元素。③将调用showmax函数统计ips列表的最多次数。
8.(1)①c[i]=c[i+1]+b[i] ②t=c[j]-c[p] ③j (2)c[j]解析 本题考查计数语句与前缀和。(1)①将统计100分到当前分数的各个分数的人数之和,如a[99]表示99分和100分的人数之和。②在print语句中有个人数t未赋值,最低分数线是j,p的初值为101,而c[101]的人数为0,因此该等级的人数和为当前分数人数和减去上一档次的人数和,同时得到③答案为j。(2)在语句for i in range(len(djfs))中,变量i表示第i个等级,因此第i个等级为dj[i]*n,j的初值为100,每次减去1,表示分数,显然c[j]小于int(dj[i]*n)要继续,等于时表示已经达到要求,退出循环。
9.(1)126 (2)①t=i ②i解析 (1)第2个进入通道1有文件是文件6,因此总共时间为5+121=126。(2)①自定义函数minload的功能是计算n个传输通道中累计传输文件最小的通道,累计值存储在upload列表中,返回最小存储容量t。②处理前n个通道的累计容量,一一对应前n个文件的容量。③语句finish.append(upload[t][0])保存已经完成上传的文件,upload[t][1]将保存累计上传量。④查找最小查找上传容量通道。
10.①m-1 ②f[n]=True ③red=i-p
解析 本题考查迭代的算法思想。把一个长度为n*100的线段分成m段,所有线段之和为一个定值n*100,每个线段的长度代表了红包的金额,线段长度越长,金额越大。因此先产生m-1个线段,因此①处答案为m-1。每个线段的终点位置t取到,则f[t]的值为True,最后一个线段的终点必须是n,否则金额的总和不等于n,因此②处答案为f[n]=True。③p是每段的开始,初值为0,下断的起点是该段的终点,因此该段的计算方法是i-p。
知识点二
1.D [变量i表示符合条件的起始位置,j表示结束位置。语句sum+=int(s[j])表示把数字串s中数字进行累加,当累加的值sum>k,表示累加的值太大,应减去前面第一个数字,开始位置i向后移动1,切片是一个左闭右开的区间,因此答案为D。]
2.A [满足条件s[i]>s[i-1]表示比前一个数据大,因此该程序代码是查找一个最长的连续递增序列。]
3.(1)e-g1-43-5h-k (2)①ans+=line[i] ②writedata(ans) (3)ord(line[i+1])==ord(line[i])+1 and not flag或ord(line[i+1])==ord(line[i])+1 and flag==False
解析 本题考查一个集合中两个元素的组合,或者是一段连续区间的开始位置和结束位置的遍历。(1)略。(2)①当条件ord(line[i+1])!=ord(line[i])+1成立时,表示连续段已经结束,终点位置是i,因此需将line[i]连接入ans中。②读取一行数据,处理完后调用writedata函数,将压缩后的结果输出保存到“压缩后.txt”中。(3)找到连续段开始位置。Flag是一个是否是头部的标志,初值为False,找到连续字符串的第1个位置后,flag的值变更为True。
4.①″0″<=i<=″9″ ②flag=True ③elif flag
解析 ①遍历字符串s,如果遍历到数字。②flag是数字串开始的标志,如果是数字则flag值为True。③若不是数字,分为前面是数字和前面不是数字两种情况。
5.①range(len(s)-1) ②elif t2!=0 ③t1=int(s[-1])
解析 ①最后一位数单独处理,因此先处理前面的数字。②分3种情况,当前数字0和非0,当前数字0及后面数字是0和非0。该处应填写后面数字非0的情况。③取出最后一个数字。
6.(1)7或7.0 (2)① b[i]+a[i] ②n-k+1 ③b[i+k]-b[i]
解析 本题考查前缀和运用。(1)连续最大的3个数是9,4,8。(2)①b[i]存储第i个人(不包含第i个人)前面所有人能力之和。变量i从0至n-1,那么其b[1]为a[0]的值,b[2]为a[0]+a[1],即b[1]+a[1]的值,b[3]为a[0]+a[1]+a[2],即b[2]+a[2]的值。②n个人中取出连续k个人,最大的开始位置i为n-k,若要取到n-k,其终值必须为n-k+1。③从位置i开始,连续k个值,其结束索引号为i+k-1,前i+k-1个人所有能力之和存储在b[i+k]中,而这一段的能力和为b[i+k]-b[i]。
7.(1)①n-1 ②ssum[j]-ssum[i+1]<=m ③maxposi,maxposi+maxn (2)maxposi=j+1
解析 本题考查前缀和的操作。(1)①从后往前遍历,因此第一个索引位置为n-1。②把索引位置i作为起点,往前查找第一个两数之差大于m的位置j,因此条件为ssum[j]-ssum[i+1]<=m,因此最大序列的开始位置为j+1。③要输出这个序列,序列的开始索引为maxposi,长度为maxn,可以得到区间。(2)略。
8.(1)29 (2)①a[i+1]==″0″ ②i+=3 ③s2=jy(s1)
解析 (1)解压缩后为1个23,21个66,1个0,1个77,5个0,数据个数为1+21+1+1+5=29。(2)①从语句s+=″0″+″,″来看,解压缩为一个0,某数为0且相邻无重复,压缩数据用两个数表示,第1个为0,第2个为0;②循环for j用于解压缩多个字符,因此压缩用3个单位的数据,因此i将加3。③语句s1=i.split(″,\n″)是对文件文件中一行按逗号和换行符进行分隔,并把分隔后的内容保存在列表s1中,因此需调用函数来计算解压缩后的数据。
9.(1)3-5,13-16 (2)①len(s) ②c=s[i]
解析 本题考查循环结构的综合应用。(1)3个及以上都会被记录起始点和终点。(2)for循环的作用为遍历字符串s,记录当前连续字符的个数,若总的个数大于或者等于3,则记录开始位置和结束位置,直到访问完所有字符结束。①遍历字符串s的所有字符,此处填len(s)。②找到的元素值与上一个元素不一致,并且已记录开始值和结束值,c重新赋值为当前位置上的字符。
10.(1)①y.append(int(data[1])) (2)②sqrt((x2-x1)**2+(y2-y1)**2)或sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))或((x2-x1)**2+(y2-y1)**2)**0.5 (3)③d1+d2-d3 ④long-maxd (4)maxd=dist(x[n-2],y[n-2],x[n-1],y[n-1])
解析 (1)分别读取x和y点的坐标值。(2)利用两点之间距离公式计算。(3)为机器人未取第i个硬币少走的路程;Max为求中的最大值。dx表示未取第i-1个硬币少走的路程。④机器人行走的最短距离为所有点的和与最大路程差。(4)循环for i in range(2,n)计算第i-1最大路程,i极值为n-1,求n-2时最大值,因此max初值当最后一个硬币未取为最短距离。
11.(1)10 (2)①he=he-a[i-4]或he-=a[i-4] ②wd[x][0] ③flag或flag==True
解析 (1)从12号开始,5个滑动平均气温值大于等于10 ℃,他的前4天中,第1个日平均气温为10号。(2)①计算下一组滑动平均温度时,需减去前面第4个温度。②第一个大于等于10 ℃且小于22 ℃的日期。③当符合入春条件时,满足条件if 10<=a[x]<22时,flag=False。
12.(1)2,5,1 (2)①ans=str(a[i])+','+ans ②flag==2 and a[i]>a[i-1] ③b[i-1]=gd
解析 本题考查数组的应用。其中列表a用于存储输入的数据元素,列表b用于记录是否为拐点,n为输入的数据元素个数,ans记录最长摇摆子序列的具体元素,函数f(n)用于统计摇摆子序列的长度,若小于3,则不是摇摆子序列,若大于等于3,则构成摇摆子序列。函数f(n)中从后往前遍历b数组,若为True,则i为拐点,将元素a[i]记录到ans中,由于是从后往前遍历数组,因此①空书写ans=str(a[i])+','+ans。flag数组用于记录摇摆序列的前一次状态,若为初始状态则为0,若为递增状态则为1,若为递减状态则为2。联系前一个elif,则这次elif情况为:前一次状态为递减,且当前a[i]>a[i-1]时,变换状态为递增。因此②空书写flag==2and a[i]>a[i-1]。循环中i从1开始进行枚举a数组元素,gd记录是否为拐点,是拐点则为True,否则是False。flag状态未改变则不是拐点,gd值为False。由于flag是摇摆序列的前一次状态,因此状态变换时实际上拐点为i-1,因此③空用该书写b[i-1]=gd。
13.(1)40 (2)①int(hours)*60+int(minutes) ②2,n+1或1,n+1 ③min<0 ④time[p2][k]-time[p1][k]
解析 (1)站点4在9:20有一班次,站点10发车时间为10点,因此大约用时40分钟。(2)①将当前时间转换距离0点0分的分钟数量。times按冒号分隔,索引0为小时,索引1为分钟,且均为字符串类型。将小时乘以60再加上分钟即可。②找到一个大于当前班次的最早时间。③min的初值小于0,当时间差小于0时也需要更新。④计算两个站点所用的时间。
知识点三
1.C [条件a[j]>a[k]表示查找一个最大值,在每趟遍历中,找出该趟中最大值的位置k,并把f[k]的值赋为True,把最值位置存储在数组p[i]中,答案为C。]
2.C [本题考查双重循环语句实现。语句for j in range(i)指在当前i前面的位置,满足条件a[i]>a[j]将b列表的值增加1,即统计该数大于他前面数的个数。A选项b列表的值依次为[0,1,2,2,4,3],B选项b列表的值依次为[0,1,1,3,0,2],C选项[0,0,2,2,0,2],C选项[0,1,2,0,2,5]。]
3.A [找出比该位置上数大的数的个数,并记录在m数组对应的位置。比″81″大的数只有″9″,m[2]的初值为1,因此他排名第2。]
4.A [本题考查自定义函数。自定义isprime的功能是判断num是否是素数。验证100以内哥德巴赫猜想的正确性,由于4=2+2,正确;n从6开始的偶数,因此n表示递增2。将n分解为j和n-j两个数,如果这两个数同时为素数,则验证成功。]
5.(1)A (2)①sum==3 ②listn[int(s[i])]+1 ③k=listn[i]/num
解析 (1)数据呈现在二维表格中,属于结构化数据。(2)①选择的科目总和为3,符合题目要求。②int(s[i])表示科目代号,相应的科目增加1。③求每个学科的选科比例。
6.①a[j][1]>=175 and a[j-1][1]<175 ②i-1 ③i+=1
解析 本题考查多个过程的重复遍历。选出身高大于等于175 cm的学生,队内两名成员的体重之和不能超过140公斤,找出最多的组合数量,应挑选出身高大于等于175且按体重降序排列,体重最大的和体重最轻的组合,达到组合数量最多。①把身高达到要求的学生尽量往前排,即后面的身高大于等于175,后面的没有达到要求,不论体重。均要向前交换。②由于从后往前冒泡,前面的数据先有序,当条件a[i][1]<175成立时,表示索引i-1的数据中身高是大于等于175的。③当条件a[i][2]+a[j][2]<=140不成立时,意味着较重体重的选手不可能匹配到更轻体重的选手,因此要找下一位选手。
7.(1)枚举 (2)找不到互质数对 (3)①random.randint(1,20) ②gcd(a[i],a[j])==1
解析 (1)遍历每一种情况,并判断是否符合问题的解,属于枚举算法。(2)全是偶数,不可能是互质数。(3)①随机产生5个1到20之间的整数。②变量i和j是一对组合的下标,首先要判断a[i]和a[j]的最大公约数是否为1。
8.(1)h (2)①s1[i-1]==s2[j-1] ②h=i (3)start+=1 (4)longstr(s1,s2)
解析 (1)只有一个共同字符h。(2)m是一个len(s2)+1行len(s1)+1列的二维列表,其每个元素的初值均为0。外循环i遍历字符串s1,内循环j遍历字符串s2,当两个字符串中字符相等时,那么长度是前一次相等的基础上加1,t表示具有相同字符的最大个数,找到最大个数时,需记录其位置i。因此①表示两个位置上字符相等,其索引位置为i-1和j-1。②为最大长度的结束位置h。(3)对st的每个位置start从0开始遍历,则start不断地向后移动。(4)略。
综合题
1.(1)BDBA (2)①″0″<=x<=″9″ ②t1=t//4 ③flag=False
解析 (1)程序的功能是将1个十进制数字转换4位二进制,分别取出高2位和低2位,再找到分别对应的ABCD编码。7除4余3,商为1,因此为BD,4除4余0,商为1,因此为BA。(2)如果是数字进行转换,不是数字,输出非法数字,因此①判断x是否是数字。③设置flag的值为False。②取出高2位。
2.(1)ZDBDBZDBDB (2)①j=start[i]+1 ②temp+=s[j] ③ans+s[j+1:]
3.(1)30 (2)①active+=0.5 ②active=active-base ③level=level//4 ④icon[start+i]*int(s[i])
4.①range(1,n*n+1) ②num ③i=n-1 ④i+=2
5.(1)3 (2)①k=i*p ②j6.(1)5,4,5,2,3,1 (2)sumx[i-1]+b[i-1]
(3)①sumx[j]-sumx[i]<=m ②maxn=j-i-1
7.(1)BECODEBA (2)① dic[i]+=1 ②dic1[zm]>dic2[zm] ③temp=s[i:i+length] ④length+=1
8.(1)ZZY (2)①x-1>=0 and s[x]==s[x-1] ②x+1<=len(s)-1 and s[x]==s[x+1] ③s+=chr(ord(″X″)+m) ④R-L>=2 ⑤i=L
9.(1)3 (2)①t>=ans或ans<=t ②t=0 ③end-ans+1
解析 (1)9月2日至4日,共计3天。(2)①若有多段最长天数,则输出最后一段的起止日期,当t等于最大值时,取后者。②不符合要求时,将t初始化为0。③根据结束时间和最长天数,计算开始时间。
10.(1)2A2B 或″2A2B″ (2)①s[i]==g[i] ②cnt2[int(g[i])]+=1或cnt2[int(g[i])]=cnt2[int(g[i])]+1 ③B=B+m或B+=m
解析 (1)数字位置均正确的有2个,数字对位置错的有两个。(2)①检测数字s[i]和猜的数字位置g[i]是否正确,变量A为数字位置正确的个数。②cnt1用于统计s中相应数字出现的次数,cnt2用于统计猜数g中相应数字出现的次数。 ③数字位置均正确的没有统计在cnt1和cnt2中。若m=0,说明该数字或者没有出现过,或者只在g或s某一个出现过,此时应不计数;若m=1,说明这个数字在g和s中均出现了1次,但没有被统计到A中,即数字正确而位置不正确有1;若m=2,说明数字正确而位置不正确。
11.(1)读取列表name_list中不包括标题行的数据 (2)①n=len(name_list) ②0 ③n-1 ④grade[bj-1]-=1
解析 (1)略。(2)①获取列表name_list长度n。p为班级下标,从0至n-1。④grade存储各班人数,当抽取该班一名学生后,其人数将减少一个。
12.(1)6 (2)①n=len(s) ②i解析 (1)第1个1表示代码以1开头,第2个1,表示1的个数,因此有1+5=6个1。(2)①对n赋值为s的长度。②不断地向后查找数字。③num表示压缩的数的个数,将这些数解压缩并存在在ns中。
13.(1)①(n-1)//2 ②m=n-j-1或m=n-i (2)i<=j and not flag
14.(1)①pl!=i 或p2!=i+1 ②k=p2 ③k=(k-1+n)%n (2)s[i]>s[i+1]
15.(1)8 (2)①c=c*10+int(ch) ②n=len(park) ③empty+=1
解析 (1)连续空车位分别为3、11、4。可停放大型车最多数量为1+5+2=8 个。(2)①变量 c将字符串中的整数转换成数字类型。②变量n存储park数组长度,决定了循环次数。③若连续两个位置均为空位,需跳过一个空位。③空位增加一个。

展开更多......

收起↑

资源预览