资源简介 (共41张PPT)一、 字符串及其基本操作第三章 字符串、队列和栈信息技术 选择性必修1 数据与数据结构必备知识练1. 输入一个数字序列,若出现连续升序的几个数(或字符),则称为一个升序段。如字符串“1231223”中存在3个升序段,分别是“123”“12”和“23”。下列Python程序的功能是统计序列中升序段的个数。s = input("请输入数字字符串:")i = 1;k = 0 ;t = 0while i < len(s): if : else: k = 0请输入数字字符串:1231223升序段个数:3>>> ① ② if k == 1 : t = t + 1 i = i + 1print("升序段个数:",t)为实现上述功能,程序中方框处应填入的正确代码是( )A. ① s[i-1]<= s[i] ② k = 1 B. ① s[i-1]<= s[i] ② k = k + 1C. ① s[i-1]< s[i] ② k = 1 D. ① s[i-1]< s[i] ② k = k + 1【解析】 本题考查列表和字符串知识。要求统计升序段个数,因此①处应该是s[i-1]< s[i],变量k记录连续升序段的字符个数,而真正的升序段数量存放于变量t中,且当k为1的时候计数,因此②处若k=1,则会重复计数,故应该采用k=k+1。D正确。D2. 有如下Python程序段:import randoms="513431282"x=random.randint(0,8)y=random.randint(0,8)res=1if x>y: x,y=y,xt=s[x:y+1]if t==t[::-1]: res=len(t)运行程序后,变量res的值可能是( )A. 2 B. 3C. 4 D. 6【解析】 本题考查Python的random模块,字符串的切片处理等知识。表达式:x=random.randint(0,8),y=random. randint(0,8),意味着x、y是一个[0,8]的随机整数。接下来进行if条件判断,判断结束后,x存放两个随机数的较小值,y存放较大值。表达式t=s[x:y+1]的结果是:t获取了s字符串中索引x到y之间的字符串。第二个if条件判断只有当字符串满足回文串时才成立,否则不成立。所以,观察原始s字符串,长度大于1的回文子串出现在索引1开始位置:"13431";索引2开始位置:"343";索引6开始位置:"282"。所以只有当随机数【x的值为1,y为5】或【x的值为2,y为4】或【x的值为6,y为8】时,t才满足回文串。此时res的值分别为回文串"13431""343"或"282"的长度,即:5、3、3。否则res应该是初值1。即res的可能值为1或3或5。B正确。B3. 有如下Python程序段:s = input("s=")t = ""for i in range(len(s)): a = s[i] if "0"<= a <= "9": t = t + a elif a == "!" : t = "" elif t !="" : print(t)执行程序段后,输入“12+34=46!789ok”(不包括双引号),输出的结果是( )A. 121234123446123446789 B. 123446789C. 121234789789 D. 121234123446789789【解析】 本题考查字符串知识。根据代码可知,s中的字符若是数字则进行顺序连接,若是“!”则将t清空,若是其他情况则输出。模拟后可知C正确。C4. 有如下Python程序段:s= "1w2e3dx@en45 ";num=0for i in s: if "a " <=i<= "z " or "A " <=i<= "Z ": continue elif "0 "<=i<= "9 ": num = num *10 + int(i) else: breakprint(num)运行该程序段后,num的值为( )A. 12345 B. 45C. 123 D. 1C【解析】 本题考查基本语法以及字符处理能力。continue为跳过本轮循环之后的步骤,进入下一轮循环,break为直接退出循环,如下表所示:s="1w2e3dx@en45",遍历s这个字符串:i 1 w 2 e 3 dnum 1 1 12 12 123 123x @ e n 4 5123 退出循环 综上所述,C正确。5. 有如下Python 程序段:s = "491053"for i in range(3): n = len(s) k = 0 for j in range(1,n-1): if s[k] >= s[j]: k = j else: break s = s[0:k] + s[k + 1:]print(s)执行该程序段后,输出的值为( )A. 053 B. 953C. 913 D. 103【解析】 本题考查字符串及简单的贪心算法。代码的本意在于删除3个字符,保持字符顺序不变,使得剩余字符组成的数字字符最大。其策略是每次都从左到右找到最小的值,然后删除k所在位置即字符。B正确。B6. 某些数据中存在“数字山峰”,例如数据“21432748”中存在“1432”和“274”两座“数字山峰”(必须包含上坡与下坡),下面程序用于求数据中“数字山峰”的数量:s=input("请输入数字串:");c=0 for i in range(1,len(s)): if and f==False: f=True elif and f==True: c=c+1 f=Falseprint("有",c,"座数字山峰")方框处的代码由以下部分组成:①f=True ②f=False ③s[i-1]>s[i] ④s[i-1] (1) (2) (3)下列选项中,代码顺序正确的是( )A. ①③④ B. ①④③C. ②③④ D. ②④③【解析】 本题考查字符处理知识。由题目可知,上峰为升序,故(2)处填写 s[i-1]s[i],并且f=True出现上峰的时候,累加c。D正确。D7. 有如下Python程序段:import randoms = "abcdefghijklmnopqrstuvwxyz"left = 0ans = ""for i in range(1,9,2): a = s[left:left + i] ans += random.choice(a) left += iprint(ans)执行上面的程序段,结果可能是( )A. abcd B. acepC. adfi D. adhpq【解析】 本题考查随机数及逻辑判断。根据代码可知,循环变量i的值,分别取1、3、5、7,切片时分别将字符串s切分为a、bcd、efghi和jklmnopq等4段,每段只能随机取一个字符,故acep是可能取的值,B正确。B8. 有如下Python程序段:s = "Python"ans = ""for i in range(len(s)) : c = s[i] if "a" <= c <= "z": if i%2==0: c=chr((ord(c)-ord ("a")-i)%26+ord ("a")) else: c=chr((ord(c)-ord ("a")+i)%26+ord ("a")) ans += cprint(ans)执行该程序段后,输出的内容是( )A. PYwHtN B. PxvesiC. PaTIOt D. Pzrkks【解析】 遍历字符串,如果是大写字母直接加到ans的右侧;如果该字符是小写字符,且在奇数位,则将其循环往右移i位加到ans的右侧;如果该字符是小写字符且在偶数位,则将其循环往左移i位。D正确。D9. 有如下Python程序段:s = input("s=")s1 = ""for i in range(len(s)): ch = s[i] if ch >= "A" and ch <= "Z": ch = chr(ord(ch)+ 32) elif ch >= "a" and ch <= "z": ch = chr(ord(ch)- 32) s1 = ch + s1print(s1)该程序段运行后,若输入“Ab12CD”,则输出的内容是( )A. aBcd B. dcBaC. aB12cd D. dc21Ba【解析】 本题考查字符串知识。大写字母转换为小写字母,小写字母转换为大写字母,然后逆序连接至变量s1中,D正确。D关键能力练10. 有如下Python程序段:s = input("s=")a = "";ans = ""for i in range(len(s)): ch = s[i] if ch >= "0" and ch <= "9": a = a + ch else: if a > ans: ans = a a = ""print(ans)执行该程序段,输入“153-023-583-65-”,则输出的结果是( )A. 023 B. 65C. 153 D. 585【解析】 本题考查字符串知识。s中的字符若是数字则进行顺序连接,若是其他字符则先比较大小(字符串大小),并将大的字符串存入ans中,然后将a清空。在四个数字字符串中,“65”最大,因此最后输出的ans即“65”。B正确。B11. 有如下Python程序段:s="6p25y3t"sum=t=0flag=Truefor ch in s: if"0"<=ch<="9": t=t*10+int(ch) else: if flag==True: sum+=t t=0 flag=not flag执行该程序段后,变量sum的值为( )A. 6 B. 9C. 28 D. 34【解析】 本题考查Python的综合应用。阅读程序可知,程序逐个读取字符串中的字符,若是数字,则转换为数值类型;若是字符,则清空t,标志位flag取反;若是字符且标志位flag为真,则将数字累加到sum。s="6p25y3t",读取到第一个数字是6,flag为真,将数字累加到sum=6;读取到第一个非数字是p,标志位flag取反后为假,读取到第二个数字是25,由于flag为假,不将数字累加到sum;读取到第二个非数字是y,标志位flag取反后为真;读取到第三个数字是3,flag为真,将数字累加到sum=6+3=9。B正确。B12. 有如下Python程序段:count = 0L = ["apple","banana","pear","orange","peach","strawberry"]for i in [1,5,2]: count += len(L[i])print(count)执行该程序段后,输出的结果是( )A. 12 B. 16C. 20 D. 22【解析】 本题考查列表切片知识。i的取值分别是1、5、2,因此将列表中的三个单词"banana""strawberry""pear"的长度累加到变量count中,因此count的值为20,C正确。C13. 某压缩算法的基本思想是用一个数值和一个字符代替具有相同值的连续字符串。例如,输入字符串“RRRRRGGBBBBBB”,压缩后为“5R2G6B”。实现上述功能的Python程序如下。s=input("输入字符串:")c=1; ans=""for i in range(①__________): if s[i-1]==s[i]: c+=1 else: ans+=str(c)+s[i-1] ②__________ ③_____________________________________________________________________ print("压缩后数据为:",ans)1,len(s)c=1ans+=str(c)+s[i]或ans+=str(c)+s[-1]或ans+=str(c)+s[len(s)-1]请回答下列问题:(1)若输入的字符串为“AAABBCCCC”,则输出的结果为__________(仅填数字和字母)。 (2)请在画线处填入合适的代码。【解析】 本题考查字符串处理知识。由代码if s[i-1]==s[i]:可知,i从1开始,到len(s)-1结束。变量c用于记录每组相同的字母个数。检测到不同的字符后转到else分支处理,将前一组代码按照顺序连接到ans中。3A2B4C14. 小明从键盘上输入一串数字以空格分隔,在不改变顺序的前提下,找出其中最长的连续递增数字子串并输出。小明编写了下列Python代码,运行效果如图所示。num=list(map(int,input( 输入数据: ).split())) #输入数字串,并转换为数值存入列表numa,c,n=1,1,0i=1while i if ①_____________________: c+=1 else: if c>a: a=c n=i ②__________ i=i+1print("最长的连续递增数字子串:",③________________) 输入数据:1 2 6 3 4 5 6 4 8最长的连续递增数字子串:[3, 4, 5, 6]num[i]>num[i-1]c=1num[n-a:n]请回答下列问题:(1)若输入“6 4 6 3 6 8 9 1 2”,输出结果为__________。 (2)为实现上述功能,请在画线处填入合适的代码。【解析】 本题考查数组的应用。算法思想是当前元素大于前面元素时计数器c加1。若当前元素小于前面元素时,并且当前升序子序列长度更长,则将当前子序列长度存入a,结束位置存入n,计数器c重新回到初值1;遍历数组,直到循环条件结束。最后根据长度和结束位置输出最长的连续递增数字子串。[3,6,8,9]15. 在输入的英文句子中,查找指定的英文单词并将其替换成相应的单词。其功能如下:输入任意的英文字符串,单词间用空格或标点符号隔开。然后输入要查找的英文单词,最后输入要替换的英文单词,要求输出该被替换单词的出现次数,并显示被替换后的字符串,运行界面如图所示,实现该功能的Python代码如下,请回答下列问题:请输入字符串:I am a nurse,and she is a nurse,too!请输入查找单词:nurse请输入替换单词:teachernurse替换次数:2替换结果为:I am a teacher,and she is a teacher, too!(1)代码中的print属于__________(单选,填字母:A. 自定义函数/B. 内建函数)。 B(2)请在画线处填入合适的代码。s = input("请输入字符串:")word = input("请输入查找单词:")pword = input("请输入替换单词:")ans = ""; n = 0;i = 0while i < len(s): ①_____________________ if ch == word: ans =②_________________ n = n + 1 ③_________________ else: ans = ans + s[i] i = i + 1print(word ,"替换次数:" ,n)print("替换结果为:",ans)ch=s[i:i+len(word)]ans + pwordi=i+len(word)【解析】 本题综合考查算法及其程序实现。(1)print属于内建函数,B正确。(2)①由代码可知,变量i是查找过程中所查找到的当前字符位置的下标。结合上下文可知,变量ch未交待,根据题意此处是在该处以查找单词长度截取字符,并判断和查找单词是否匹配,所以答案为:ch=s[i:i+len(word)],使用了切片的方法。②ans是替换后的字符串,若匹配到合适的字符串,则对原文进行替换,故答案为ans + pword。③当前查找到的字符串是查找的单词是word,则下一个下标应该跳过该单词长度,即i=i + len(word)。16. 某字符串解密程序的运行结果如图所示。请输入十六进制密文:9E919697BC明文为:China解密算法如下:设十六进制密文的长度为偶数n,则进行n/2轮操作,每轮操作的步骤如下:①从左到右依次取密文中的2位十六进制数,分别转换为4位二进制数,不足4位的在左边补0,按一定顺序连接成8位二进制数(例如,十六进制数91转换为10010001)。②将得到的8位二进制编码进行取反码(0变1,1变0)操作,如10010001的反码是01101110。③将8位二进制数转化为十进制数,并以该十进制数作为ASCII码,转换为相应的字符。将每轮得到的字符倒序连接,即得到最终的明文。请回答下列问题:(1)如果输入的密文是“9C9D”,那么解密后的明文为__________。(字母‘a’的ASCII码为97) bc(2)请在画线处填入合适的代码。def htob(ch): #将1位十六进制字符转换为4位二进制数,并将每位取反 hex={ A :10, B :11, C :12, D :13, E :14, F :15} if A <=ch<= F : ①_____________ else: t=int(ch) b= for i in range(4): r=t%2; b=str(1-r)+b; t=t//2 return bs=input("请输入密文:")tmp= for i in range(0,len(s),2): #依次取出两位十六进制密文,并转换为二进制数 t=s[i:i+2] ②__________________________________ mw= for i in range(0,len(tmp),8): #将每8位二进制数转换为十进制数,并转换为明文字符 t=tmp[i:i+8] x=0 for j in range(8): ③___________________________________________ mw=chr(x)+mwprint(mw)t=hex[ch]tmp+=htob(t[0])+htob(t[1])x=x*2+int(t[j])或x+=int(t[j])*2**(7-j)【解析】 (1)解密过程如下,解密后的明文为bc。密文 9C 9D 转换为四位二进制 1001 1100 1001 1101取反码 0110 0011 0110 0010转换为十进制 99 98 转换为相应的字符 c b 倒序连接 bc (2)①自定义函数htob() 将1位十六进制数码转换为4位二进制数,并将每位二进制数取反,首先需要把该十六进制数码ch转换为十进制数t。若ch为十进制数码字符,可直接通过int()函数转换为十进制整数,若ch不是十进制数码字符,即ch属于十六进制数码字符"A"~"F",则应当以ch为键,在字典hex中查找对应的值,即为t。因此答案为t=hex[ch]。②所在循环的功能为依次取出两位十六进制密文,并转换为二进制。t为取出的两位十六进制密文,tmp存储密文转换为二进制的结果。自定义函数htob() 将1位十六进制数码转换为4位二进制数,可调用两次自定义函数,将得到的结果依次相加得到八位二进制数,累加至tmp。因此答案为tmp+=htob(t[0])+htob(t[1])。③二进制数字符串t转换为十进制数x,有两种方法。方法一:当前累计结果乘以基数再累加对应数位上的字符转换后的数值,即x=x*2+int(t[j]);方法二:取出字符转换为数值乘以对应数位的权值,并累加,即x+=int(t[j])*2**(7-j)。17. 小明编写了一个字符串加密程序,功能为:输入明文,显示加密后的密文。加密算法如下:①若是大写字母,则进行字母替换:英文26个字母按键盘QWERT的顺序排列,从第一行到第三行连接起来再与字母表顺序进行替换,如Q用A来替换,Y用F替换,如表所示。Q W E R T Y U I O P A S DA B C D E F G H I J K L MF G H J K L Z X C V B N MN O P Q R S T U V W X Y Z②将经过字母替换后的明文每个字符的8位二进制ASCII码(不足8位的左端补0,补足8位)分成两段(左4位一段,右4位为另一段),如字符“A”的二进制ASCII值01000001,分段后为0100,0001。③将高位段(左边4位)转化为十六进制数(如0100转化为4)。④对低位段(右边4位)执行0→1,1→0后转化为十六进制数(如0001→1110→14→E)。⑤依次连接两位十六进制数,得到该字符的密文,如“Q”的密文为“4E”。⑥将每个字符的密文按照明文的顺序依次连接。程序运行结果如图所示:请输入待加密的字符:Qa8密文为:4E6E37实现上述功能的Python程序如下,请在画线处填入合适的代码。def dtb(num): #十进制转 8 位二进制,高低 4 位分别处理 i=0;result="" while i<8: if i<4: y=①________________________________ else: y=num % 2 num=num//2 result=str(y)+result i+=1 return resultdef change(s): #二进制转为十六进制 sum=0;result="" for i in range(0,len(s),4): sum=int(s[i])*8+int(s[i+1])*4+int(s[i+2])*2+int(s[i+3]) if sum>9: result+=chr(sum+55) else: result+=str(sum) return resultyw=input("请输入待加密的字符:")jm=""1-num % 2或(num+1)%2mm={"Q":"A","W":"B","E":"C","R":"D","T":"E","Y":"F","U":"G","I":"H","O":"I","P":"J","A":"K","S":"L","D":"M","F":"N","G":"O","H":"P","J":"Q","K":"R","L":"S" ,"Z":"T","X":"U","C":"V","V":"W","B":"X","N":"Y","M":"Z"}for i in range(len(yw)): if "A"<=yw[i]<="Z": ②__________________ else: jm+=yw[i]jm1=""for i in jm: jm1+=③_____________________ print("密文为:",jm1)jm+=mm[yw[i]]change(dtb(ord(i)))【解析】 本题考查字符编码、进制转换及字符加密的相关知识。①自定义函数dtb(num)完成十进制转二进制,并按高4位低4位分别处理;由题意可知,转换后的低4位值要按位取反(0变1,1变0),直接除2取余所得的余数y=num % 2,那么对余数按位取反可以用(num+1) % 2 或 1-num % 2实现;主程序部分首先完成字母替换,再利用两个自定义函数得到密文。②此处所在的循环遍历原文yw的索引,当原文字符为大写字母时,依题意进行字母替换,即在字典mm中,以yw[i]为键,查找对应的值,并连接到jm字符串上,因此答案为jm+=mm[yw[i]]。③②处填jm+=mm[yw[i]]字母替换后的明文还要执行2-6步,此处要通过调用自定义函数实现,即最终的密文jm1+=change(dtb(ord(i)))。一、 字符串及其基本操作1. 输入一个数字序列,若出现连续升序的几个数(或字符),则称为一个升序段。如字符串“1231223”中存在3个升序段,分别是“123”“12”和“23”。下列Python程序的功能是统计序列中升序段的个数。请输入数字字符串:1231223升序段个数:3>>>s = input("请输入数字字符串:")i = 1;k = 0 ;t = 0while i < len(s): if ① : ② else: k = 0 if k == 1 : t = t + 1 i = i + 1print("升序段个数:",t)为实现上述功能,程序中方框处应填入的正确代码是( D )A. ① s[i-1]<= s[i] ② k = 1 B. ① s[i-1]<= s[i] ② k = k + 1C. ① s[i-1]< s[i] ② k = 1 D. ① s[i-1]< s[i] ② k = k + 1【解析】 本题考查列表和字符串知识。要求统计升序段个数,因此①处应该是s[i-1]< s[i],变量k记录连续升序段的字符个数,而真正的升序段数量存放于变量t中,且当k为1的时候计数,因此②处若k=1,则会重复计数,故应该采用k=k+1。D正确。2. 有如下Python程序段:import randoms="513431282"x=random.randint(0,8)y=random.randint(0,8)res=1if x>y: x,y=y,xt=s[x:y+1]if t==t[::-1]: res=len(t)运行程序后,变量res的值可能是( B )A. 2 B. 3C. 4 D. 6【解析】 本题考查Python的random模块,字符串的切片处理等知识。表达式:x=random.randint(0,8),y=random. randint(0,8),意味着x、y是一个[0,8]的随机整数。接下来进行if条件判断,判断结束后,x存放两个随机数的较小值,y存放较大值。表达式t=s[x:y+1]的结果是:t获取了s字符串中索引x到y之间的字符串。第二个if条件判断只有当字符串满足回文串时才成立,否则不成立。所以,观察原始s字符串,长度大于1的回文子串出现在索引1开始位置:"13431";索引2开始位置:"343";索引6开始位置:"282"。所以只有当随机数【x的值为1,y为5】或【x的值为2,y为4】或【x的值为6,y为8】时,t才满足回文串。此时res的值分别为回文串"13431""343"或"282"的长度,即:5、3、3。否则res应该是初值1。即res的可能值为1或3或5。B正确。3. 有如下Python程序段:s = input("s=")t = ""for i in range(len(s)): a = s[i] if "0"<= a <= "9": t = t + a elif a == "!" : t = "" elif t !="" : print(t)执行程序段后,输入“12+34=46!789ok”(不包括双引号),输出的结果是( C )A. 121234123446123446789 B. 123446789C. 121234789789 D. 121234123446789789【解析】 本题考查字符串知识。根据代码可知,s中的字符若是数字则进行顺序连接,若是“!”则将t清空,若是其他情况则输出。模拟后可知C正确。4. 有如下Python程序段:s= "1w2e3dx@en45 ";num=0for i in s: if "a " <=i<= "z " or "A " <=i<= "Z ": continue elif "0 "<=i<= "9 ": num = num *10 + int(i) else: breakprint(num)运行该程序段后,num的值为( C )A. 12345 B. 45C. 123 D. 1【解析】 本题考查基本语法以及字符处理能力。continue为跳过本轮循环之后的步骤,进入下一轮循环,break为直接退出循环,如下表所示:s="1w2e3dx@en45",遍历s这个字符串:i 1 w 2 e 3 dnum 1 1 12 12 123 123x @ e n 4 5123 退出循环综上所述,C正确。5. 有如下Python 程序段:s = "491053"for i in range(3): n = len(s) k = 0 for j in range(1,n-1): if s[k] >= s[j]: k = j else: break s = s[0:k] + s[k + 1:]print(s)执行该程序段后,输出的值为( B )A. 053 B. 953C. 913 D. 103【解析】 本题考查字符串及简单的贪心算法。代码的本意在于删除3个字符,保持字符顺序不变,使得剩余字符组成的数字字符最大。其策略是每次都从左到右找到最小的值,然后删除k所在位置的字符。B正确。6. 某些数据中存在“数字山峰”,例如数据“21432748”中存在“1432”和“274”两座“数字山峰”(必须包含上坡与下坡),下面程序用于求数据中“数字山峰”的数量:s=input("请输入数字串:");c=0 (1) for i in range(1,len(s)): if (2) and f==False: f=True elif (3) and f==True: c=c+1 f=Falseprint("有",c,"座数字山峰")方框处的代码由以下部分组成:①f=True ②f=False ③s[i-1]>s[i] ④s[i-1]下列选项中,代码顺序正确的是( D )A. ①③④ B. ①④③C. ②③④ D. ②④③【解析】 本题考查字符处理知识。由题目可知,上峰为升序,故(2)处填写 s[i-1]s[i],并且f=True出现上峰的时候,累加c。D正确。7. 有如下Python程序段:import randoms = "abcdefghijklmnopqrstuvwxyz"left = 0ans = ""for i in range(1,9,2): a = s[left:left + i] ans += random.choice(a) left += iprint(ans)执行上面的程序段,结果可能是( B )A. abcd B. acepC. adfi D. adhpq【解析】 本题考查随机数及逻辑判断。根据代码可知,循环变量i的值,分别取1、3、5、7,切片时分别将字符串s切分为a、bcd、efghi和jklmnopq等4段,每段只能随机取一个字符,故acep是可能取的值,B正确。8. 有如下Python程序段:s = "Python"ans = ""for i in range(len(s)) : c = s[i] if "a" <= c <= "z": if i%2==0: c=chr((ord(c)-ord ("a")-i)%26+ord ("a")) else: c=chr((ord(c)-ord ("a")+i)%26+ord ("a")) ans += cprint(ans)执行该程序段后,输出的内容是( D )A. PYwHtN B. PxvesiC. PaTIOt D. Pzrkks【解析】 遍历字符串,如果是大写字母直接加到ans的右侧;如果该字符是小写字符,且在奇数位,则将其循环往右移i位加到ans的右侧;如果该字符是小写字符且在偶数位,则将其循环往左移i位。D正确。9. 有如下Python程序段:s = input("s=")s1 = ""for i in range(len(s)): ch = s[i] if ch >= "A" and ch <= "Z": ch = chr(ord(ch)+ 32) elif ch >= "a" and ch <= "z": ch = chr(ord(ch)- 32) s1 = ch + s1print(s1)该程序段运行后,若输入“Ab12CD”,则输出的内容是( D )A. aBcd B. dcBaC. aB12cd D. dc21Ba【解析】 本题考查字符串知识。大写字母转换为小写字母,小写字母转换为大写字母,然后逆序连接至变量s1中,D正确。10. 有如下Python程序段:s = input("s=")a = "";ans = ""for i in range(len(s)): ch = s[i] if ch >= "0" and ch <= "9": a = a + ch else: if a > ans: ans = a a = ""print(ans)执行该程序段,输入“153-023-583-65-”,则输出的结果是( B )A. 023 B. 65C. 153 D. 585【解析】 本题考查字符串知识。s中的字符若是数字则进行顺序连接,若是其他字符则先比较大小(字符串大小),并将大的字符串存入ans中,然后将a清空。在四个数字字符串中,“65”最大,因此最后输出的ans即“65”。B正确。11. 有如下Python程序段:s="6p25y3t"sum=t=0flag=Truefor ch in s: if"0"<=ch<="9": t=t*10+int(ch) else: if flag==True: sum+=t t=0 flag=not flag执行该程序段后,变量sum的值为( B )A. 6 B. 9C. 28 D. 34【解析】 本题考查Python的综合应用。阅读程序可知,程序逐个读取字符串中的字符,若是数字,则转换为数值类型;若是字符,则清空t,标志位flag取反;若是字符且标志位flag为真,则将数字累加到sum。s="6p25y3t",读取到第一个数字是6,flag为真,将数字累加到sum=6;读取到第一个非数字是p,标志位flag取反后为假,读取到第二个数字是25,由于flag为假,不将数字累加到sum;读取到第二个非数字是y,标志位flag取反后为真;读取到第三个数字是3,flag为真,将数字累加到sum=6+3=9。B正确。12. 有如下Python程序段:count = 0L = ["apple","banana","pear","orange","peach","strawberry"]for i in [1,5,2]: count += len(L[i])print(count)执行该程序段后,输出的结果是( C )A. 12 B. 16C. 20 D. 22【解析】 本题考查列表切片知识。i的取值分别是1、5、2,因此将列表中的三个单词"banana""strawberry""pear"的长度累加到变量count中,因此count的值为20,C正确。13. 某压缩算法的基本思想是用一个数值和一个字符代替具有相同值的连续字符串。例如,输入字符串“RRRRRGGBBBBBB”,压缩后为“5R2G6B”。实现上述功能的Python程序如下。s=input("输入字符串:")c=1; ans=""for i in range(① 1,len(s) ): if s[i-1]==s[i]: c+=1 else: ans+=str(c)+s[i-1] ② c=1 ③ ans+=str(c)+s[i]或ans+=str(c)+s[-1]或ans+=str(c)+s[len(s)-1] print("压缩后数据为:",ans)请回答下列问题:(1)若输入的字符串为“AAABBCCCC”,则输出的结果为 3A2B4C (仅填数字和字母)。 (2)请在画线处填入合适的代码。【解析】 本题考查字符串处理知识。由代码if s[i-1]==s[i]:可知,i从1开始,到len(s)-1结束。变量c用于记录每组相同的字母个数。检测到不同的字符后转到else分支处理,将前一组代码按照顺序连接到ans中。14. 小明从键盘上输入一串数字以空格分隔,在不改变顺序的前提下,找出其中最长的连续递增数字子串并输出。小明编写了下列Python代码,运行效果如图所示。输入数据:1 2 6 3 4 5 6 4 8最长的连续递增数字子串:[3, 4, 5, 6]num=list(map(int,input( 输入数据: ).split())) #输入数字串,并转换为数值存入列表numa,c,n=1,1,0i=1while i if ① num[i]>num[i-1] : c+=1 else: if c>a: a=c n=i ② c=1 i=i+1print("最长的连续递增数字子串:",③ num[n-a:n] ) 请回答下列问题:(1)若输入“6 4 6 3 6 8 9 1 2”,输出结果为 [3,6,8,9] 。 (2)为实现上述功能,请在画线处填入合适的代码。【解析】 本题考查数组的应用。算法思想是当前元素大于前面元素时计数器c加1。若当前元素小于前面元素时,并且当前升序子序列长度更长,则将当前子序列长度存入a,结束位置存入n,计数器c重新回到初值1;遍历数组,直到循环条件结束。最后根据长度和结束位置输出最长的连续递增数字子串。15. 在输入的英文句子中,查找指定的英文单词并将其替换成相应的单词。其功能如下:输入任意的英文字符串,单词间用空格或标点符号隔开。然后输入要查找的英文单词,最后输入要替换的英文单词,要求输出该被替换单词的出现次数,并显示被替换后的字符串,运行界面如图所示,实现该功能的Python代码如下,请回答下列问题:请输入字符串:I am a nurse,and she is a nurse,too!请输入查找单词:nurse请输入替换单词:teachernurse替换次数:2替换结果为:I am a teacher,and she is a teacher, too!(1)代码中的print属于 B (单选,填字母:A. 自定义函数/B. 内建函数)。 (2)请在画线处填入合适的代码。s = input("请输入字符串:")word = input("请输入查找单词:")pword = input("请输入替换单词:")ans = ""; n = 0;i = 0while i < len(s): ① ch=s[i:i+len(word)] if ch == word: ans =② ans + pword n = n + 1 ③ i=i+len(word) else: ans = ans + s[i] i = i + 1print(word ,"替换次数:" ,n)print("替换结果为:",ans)【解析】 本题综合考查算法及其程序实现。(1)print属于内建函数,B正确。(2)①由代码可知,变量i是查找过程中所查找到的当前字符位置的下标。结合上下文可知,变量ch未交待,根据题意此处是在该处以查找单词长度截取字符,并判断和查找单词是否匹配,所以答案为:ch=s[i:i+len(word)],使用了切片的方法。②ans是替换后的字符串,若匹配到合适的字符串,则对原文进行替换,故答案为ans + pword。③当前查找到的字符串是查找的单词是word,则下一个下标应该跳过该单词长度,即i=i + len(word)。16. 某字符串解密程序的运行结果如图所示。请输入十六进制密文:9E919697BC明文为:China解密算法如下:设十六进制密文的长度为偶数n,则进行n/2轮操作,每轮操作的步骤如下:①从左到右依次取密文中的2位十六进制数,分别转换为4位二进制数,不足4位的在左边补0,按一定顺序连接成8位二进制数(例如,十六进制数91转换为10010001)。②将得到的8位二进制编码进行取反码(0变1,1变0)操作,如10010001的反码是01101110。③将8位二进制数转化为十进制数,并以该十进制数作为ASCII码,转换为相应的字符。将每轮得到的字符倒序连接,即得到最终的明文。请回答下列问题:(1)如果输入的密文是“9C9D”,那么解密后的明文为 bc 。(字母‘a’的ASCII码为97) (2)请在画线处填入合适的代码。def htob(ch): #将1位十六进制字符转换为4位二进制数,并将每位取反 hex={ A :10, B :11, C :12, D :13, E :14, F :15} if A <=ch<= F : ① t=hex[ch] else: t=int(ch) b= for i in range(4): r=t%2; b=str(1-r)+b; t=t//2 return bs=input("请输入密文:")tmp= for i in range(0,len(s),2): #依次取出两位十六进制密文,并转换为二进制数 t=s[i:i+2] ② tmp+=htob(t[0])+htob(t[1]) mw= for i in range(0,len(tmp),8): #将每8位二进制数转换为十进制数,并转换为明文字符 t=tmp[i:i+8] x=0 for j in range(8): ③ x=x*2+int(t[j])或x+=int(t[j])*2**(7-j) mw=chr(x)+mwprint(mw)【解析】 (1)解密过程如下,解密后的明文为bc。密文 9C 9D转换为四位二进制 1001 1100 1001 1101取反码 0110 0011 0110 0010转换为十进制 99 98转换为相应的字符 c b倒序连接 bc(2)①自定义函数htob() 将1位十六进制数码转换为4位二进制数,并将每位二进制数取反,首先需要把该十六进制数码ch转换为十进制数t。若ch为十进制数码字符,可直接通过int()函数转换为十进制整数,若ch不是十进制数码字符,即ch属于十六进制数码字符"A"~"F",则应当以ch为键,在字典hex中查找对应的值,即为t。因此答案为t=hex[ch]。②所在循环的功能为依次取出两位十六进制密文,并转换为二进制。t为取出的两位十六进制密文,tmp存储密文转换为二进制的结果。自定义函数htob() 将1位十六进制数码转换为4位二进制数,可调用两次自定义函数,将得到的结果依次相加得到八位二进制数,累加至tmp。因此答案为tmp+=htob(t[0])+htob(t[1])。③二进制数字符串t转换为十进制数x,有两种方法。方法一:当前累计结果乘以基数再累加对应数位上的字符转换后的数值,即x=x*2+int(t[j]);方法二:取出字符转换为数值乘以对应数位的权值,并累加,即x+=int(t[j])*2**(7-j)。17. 小明编写了一个字符串加密程序,功能为:输入明文,显示加密后的密文。加密算法如下:①若是大写字母,则进行字母替换:英文26个字母按键盘QWERT的顺序排列,从第一行到第三行连接起来再与字母表顺序进行替换,如Q用A来替换,Y用F替换,如表所示。Q W E R T Y U I O P A S DA B C D E F G H I J K L MF G H J K L Z X C V B N MN O P Q R S T U V W X Y Z②将经过字母替换后的明文每个字符的8位二进制ASCII码(不足8位的左端补0,补足8位)分成两段(左4位一段,右4位为另一段),如字符“A”的二进制ASCII值01000001,分段后为0100,0001。③将高位段(左边4位)转化为十六进制数(如0100转化为4)。④对低位段(右边4位)执行0→1,1→0后转化为十六进制数(如0001→1110→14→E)。⑤依次连接两位十六进制数,得到该字符的密文,如“Q”的密文为“4E”。⑥将每个字符的密文按照明文的顺序依次连接。程序运行结果如图所示:请输入待加密的字符:Qa8密文为:4E6E37实现上述功能的Python程序如下,请在画线处填入合适的代码。def dtb(num): #十进制转 8 位二进制,高低 4 位分别处理 i=0;result="" while i<8: if i<4: y=① 1-num % 2或(num+1)%2 else: y=num % 2 num=num//2 result=str(y)+result i+=1 return resultdef change(s): #二进制转为十六进制 sum=0;result="" for i in range(0,len(s),4): sum=int(s[i])*8+int(s[i+1])*4+int(s[i+2])*2+int(s[i+3]) if sum>9: result+=chr(sum+55) else: result+=str(sum) return resultyw=input("请输入待加密的字符:")jm=""mm={"Q":"A","W":"B","E":"C","R":"D","T":"E","Y":"F","U":"G","I":"H","O":"I","P":"J","A":"K","S":"L","D":"M","F":"N","G":"O","H":"P","J":"Q","K":"R","L":"S" ,"Z":"T","X":"U","C":"V","V":"W","B":"X","N":"Y","M":"Z"}for i in range(len(yw)): if "A"<=yw[i]<="Z": ② jm+=mm[yw[i]] else: jm+=yw[i]jm1=""for i in jm: jm1+=③ change(dtb(ord(i))) print("密文为:",jm1)【解析】 本题考查字符编码、进制转换及字符加密的相关知识。①自定义函数dtb(num)完成十进制转二进制,并按高4位低4位分别处理;由题意可知,转换后的低4位值要按位取反(0变1,1变0),直接除2取余所得的余数y=num % 2,那么对余数按位取反可以用(num+1) % 2 或 1-num % 2实现;主程序部分首先完成字母替换,再利用两个自定义函数得到密文。②此处所在的循环遍历原文yw的索引,当原文字符为大写字母时,依题意进行字母替换,即在字典mm中,以yw[i]为键,查找对应的值,并连接到jm字符串上,因此答案为jm+=mm[yw[i]]。③②处填jm+=mm[yw[i]]字母替换后的明文还要执行2-6步,此处要通过调用自定义函数实现,即最终的密文jm1+=change(dtb(ord(i)))。 展开更多...... 收起↑ 资源列表 一、 字符串及其基本操作.docx 一、 字符串及其基本操作.pptx