资源简介 综合核心素养测评卷(二)一、 选择题(本大题共12小题,每小题列出的四个备选项中只有一个是符合题目要求的)1. 有中缀表达式为“4*6+(3+5)/2”,现利用栈计算该表达式:从左向右扫描,遇到数字时,直接将数字放到后缀表达式后方;当遇到运算符时,运算符入栈;若站内有多个运算符,优先级高的运算符必须先出栈放到后缀表达式中,然后优先级低的运算符再入栈。左右括号相遇后抵消。如此反复操作,直到栈为空为止。其后缀表达式是( )A. 46*35+2/+ B. 46*35+2+/C. 4*635+2/+ D. 46*3+52/+2. 有1个栈,从栈顶到栈底依次为元素a、b、c,并且已知元素d已入栈并出栈,则这四个元素的入栈顺序可能为( )A. c,d,b,a B. b,d,c,aC. a,b,c,d D. d,a,b,c3. 有如下Python程序段:q,head,tail,ans=[""]*100,0,0,""for i in range(len(s)): q[tail]=s[i] tail+=1while head ans=ans+q[head] head+=1 if head q[tail]=q[head] tail+=1 head+=1print(ans)当s的值为字符串“QUEUE”时,程序输出的结果为( )A. QUEUE B. EUEUQC. QEUUE D. QEEUU4. 已知二叉树的中序遍历序列是BEDAFHCIG,前序遍历序列是ABDECFHGI,则它的后序遍历序列是( )A. BDEFHCIGA B. IGHFEDCBAC. EDBFHIGCA D. EDBHFIGCA5. 有如下Python程序段:def f(s): if len(s)==2: return s else: return f(s[len(s)//2+1:]+s[:len(s)//2])print(f("abcde"))当执行该程序段后,显示的结果是( )A. eb B. beC. da D. ad6. 有如下Python程序段:s = I Love You HangZhou! s1 = for i in range(0, len(s), 3): c = s[i] if ord(c)>= ord( a ): c = chr(ord(c)- ord( a )+ ord( A )) s1 = c + s1print(s1)程序运行后,输出的值是( )A. OUAZU B. OUAUC. UZAUO D. UAUO7. 有如下Python程序段:data= My Name is Tom! imax,t=0,0for ch in data: if ( A <=ch<= Z )or ( a <=ch<= z ): t+=1 else: if t>imax: imax=t t=0print(imax)执行上述代码后,输出的内容是( )A. 2 B. 3C. 4 D. 58. 有n名同学围成一圈,将同学们从1到n进行编号,然后从1号开始进行报数,报到m(m>1)的同学出局,输出每次出局同学的编号。画线处应填入的代码是( )que = [0] * 1000n = int(input())m = int(input())tail, head = 0, 0for i in range(1, n + 1): que[tail] = i tail += 1num = 0while head < tail: ① head += 1 num += 1 if num == m: ② num = 0 else: ③ tail += 1A. ①x = que[head] ②print(x, end=" ") ③que[tail] = xB. ①x = que[tail] ②print(x, end=" ") ③que[tail] = xC. ①x = que[head] ②x = que[head] ③print(x, end=" ")D. ①x = que[tail] ②x = que[head] ③print(x, end=" ")9. 数组元素d[0]至d[n-1]依次存放着n个不重复的升序数据,现需要将值为x的元素删除,例如,n为5,数组d为[2,3,6,8,9],待删除数x为8,删除操作后输出[2,3,6,9]。实现该功能的Python程序如下:d=[2,3,6,8,9]n=len(d)-1;i=0x=int(input("请输入待删除数据:"))while i i+=1for k in range( ① ): ② d=d[:-1]画线处应填入的正确代码是( )A. ①i+1,n ②d[k+1]=d[k] B. ①i-1,n ②d[k-1]=d[k]C. ①i,n-1 ②d[k]=d[k+1] D. ①i,n ②d[k]=d[k+1]10. 有如下Python程序段:#随机产生10个整型元素的非降序序列,依次存入列表a(a[0]!=a[9]),代码略key=int(input())i=0;j=9n=0while i<=j: m=(i+j)//2 n+=1 if a[m] i=m+1 else: j=m-1执行上述程序段后,下列说法中,错误的是( )A. a[i+1]可能等于key B. a[j]可能等于keyC. i一定等于j+1 D. n的值一定大于211. 有如下Python程序段:a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]x=1p=head=2if x==a[p][0]: head=a[p][1]else: while p!=-1: if x==a[p][0]: a[pre][1]=a[p][1] else: pre=p p=a[p][1]运行该段程序后,a[2][1]的值为( )A. -1 B. 0C. 1 D. 312. 有如下Python程序段:head=4;tail=3a=[3,6,7,12,4]n=len(a)while (head+1)%n!=tail: if a[head]%3!=0: head=(head+1)%n else: a[tail]=a[head]//3 head=(head+1)%n tail=(tail+1)%nprint(a[head])执行上述代码后,输出的内容是( )A. 2 B. 7C. 3 D. 4二、 非选择题(本大题共3小题)13. 近期学校举办了运动会,小李协助老师完成实心球记分员的工作,他提前准备了Python程序,可以将每位运动员的成绩录入并存储。每位运动员均有自己的三位数编号(001—999)。实心球比赛采用三轮投掷模式,即第一轮全部运动员各投掷一次后,再进行第二轮、第三轮。每次运动员投掷后,小李将他的编号和此次成绩存入电脑,存储运动员的成绩时,采用链表结构进行存储。录入的同时,每条记录会按照选手编号进行升序排列。如图所示为小李最后一次输入后的数据截图。请输入运动员编号:592请输入该运动员成绩:13.2head: 13[[623,14.1,35],[766,12.5,39],[253,9.8,33],[277,10.2,42],[537,8.9,4],[674,13.1,31],[452,12.5,34],[176,10.6,40],[251,9.8,32],[831,15.1,-1],[247,8.7,38],[158,9.3,37],[293,10.5,36],[144,11.2,43],[592,14.1,30],[623,13.7,0],[766,9.9,1],[253,10.7,2],[277,10.2,3],[537,9.5,4],[674,11.6,5],[452,10.3,6],[176,10.3,7],[251,10.5,8],[831,14.5,9],[247,10.2,10],[158,10.5,11],[293,10.5,12],[144,13.0,41],[592,13.8,14],[623,14.0,15],[766,10.5,16],[253,10.2,17],[277,11.0,18],[537,11.3,19],[674,12.5,20],[452,13.0,211],[176,11.0,22],[251,9.5,23],[831,14.8,24],[247,9.5,25],[158,10.2,26],[293,9.3,27],[144,14.1,28],[592,13.2,29]]例如,当前数据中,编号最小的运动员位于索引值为13的位置,值为[144,11.2,43],其中144是他的编号,11.2是他这一次的成绩,43是他另一条记录的索引地址。因此,他的另一条记录位于索引值为43的位置,值为[144,14.1,28],他的第三条记录位于索引值为28的位置,值为[144,13.0,41]。录入成绩的Python代码如下,请在画线处填入合适的代码。d=[]head=-1bh=int(input( 请输入运动员编号: ))cj=float(input( 请输入运动员成绩: ))d.append([bh,cj,-1])head,i=0,1while i<=1000: bh=int(input( 请输入运动员编号: )) cj=float(input( 请输入运动员成绩: )) d.append([bh,cj,-1]) p=head if bh d[i][2]=p else: q=d[p][2] while d[q][0] p=q q=d[p][2] d[p][2]=i d[i][2]=q i+=1 print( head: ,head) print(d)14. 自从学习了不同进制之后,小明设计了一个计算不同进制数的加法器,并用python编程实现。输入一个加法算式,加数可以是十进制数、二进制数或者十六进制数,程序的功能是输出它们的和。例如,输入形如“1010B+1DH+109D=”的加法算式后,执行程序,输出“和是148”的结果。Python代码如下。请回答下列问题:s=input( 输入一个混合进制的加法算式: )dic={ B :2, D :10, H :16}st=[ ]*100top, i, x, m=-1, 0, 0, 0while i if s[i]== + or s[i]== = : m=① top=top-1 t=0 while top!=-1: if st[top]>= A and st[top]<= F : st[top]=ord(st[top])-ord( A )+10 else: st[top]=int(st[top]) ② t=t+1 top=top-1 else: ③ st[top]=s[i] i=i+1print( 和是 ,x)(1)请在画线处填入合适的代码。(2)若输入“1011B+2DH+178D”,则输出的结果是 。 15. 一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,那么称该序列为摇摆序列。小王同学想求出某个数列的最长摇摆子序列,以序列[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]。根据图1分析得知,当序列有一段连续的递增(或递减)时,可形成摇摆子序列,我们只需要找到每一次转折中的拐点元素。图1小王编写了一个Python程序实现该功能:程序运行时,输入一串用逗号分隔和结束的数字,可以得到最长摇摆子序列的长度,以及具体的序列。程序运行界面如图2所示。请输入以逗号分隔和结束的数据(不超过20个数):3,14,7,6,9,12,10,8,13,最长摇摆子序列长度为:6最长摇摆子序列为:3,14,6,12,8,13图2(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 ① ans=str(a[i])+ , +ans return ffor ch in s: if ch == ",": a[i] = int(t); n += 1; i += 1; t = "" else: t = t + chfor i in range(1, n): gd = True if flag == 0: if a[i] > a[i - 1]: flag = 1 elif a[i] < a[i - 1]: flag = 2 else: gd = False elif flag == 1 and a[i] < a[i - 1]: flag = 2 elif ② : flag = 1 else: gd = False ③ if f(n)< 3: print("不构成摇摆子序列")else: print("最长摇摆子序列长度为", str(f(n))) print("最长摇摆子序列为:",ans)综合核心素养测评卷(二)一、 选择题(本大题共12小题,每小题列出的四个备选项中只有一个是符合题目要求的)1. 有中缀表达式为“4*6+(3+5)/2”,现利用栈计算该表达式:从左向右扫描,遇到数字时,直接将数字放到后缀表达式后方;当遇到运算符时,运算符入栈;若站内有多个运算符,优先级高的运算符必须先出栈放到后缀表达式中,然后优先级低的运算符再入栈。左右括号相遇后抵消。如此反复操作,直到栈为空为止。其后缀表达式是( A )A. 46*35+2/+ B. 46*35+2+/C. 4*635+2/+ D. 46*3+52/+【解析】 本题考查栈操作的相关操作。依题意可得后缀表达式为:46*35+2/+ ,A正确。2. 有1个栈,从栈顶到栈底依次为元素a、b、c,并且已知元素d已入栈并出栈,则这四个元素的入栈顺序可能为( A )A. c,d,b,a B. b,d,c,aC. a,b,c,d D. d,a,b,c【解析】 本题考查栈的基本操作。根据题意栈中abc三个元素的状态,从栈顶到栈底依次是a、b、c,故入栈顺序c一定在b前,b一定在a前,B、C、D均错误。c入栈,d入栈,d出栈,b入栈,a入栈,即得到题干描述的状态,A正确。3. 有如下Python程序段:q,head,tail,ans=[""]*100,0,0,""for i in range(len(s)): q[tail]=s[i] tail+=1while head ans=ans+q[head] head+=1 if head q[tail]=q[head] tail+=1 head+=1print(ans)当s的值为字符串“QUEUE”时,程序输出的结果为( D )A. QUEUE B. EUEUQC. QEUUE D. QEEUU【解析】 本题考查队列的入队出队操作。该程序段由一个for循环和一个while循环构成。for循环:遍历字符串s,取出字符依次入队;while循环:若队列非空,队首元素出队并累加至字符串ans中,若队列仍非空,则当前的队首元素继续出队并在队尾入队,以此循环。循环结束后,ans的值应为“QEEUU”,程序输出的结果为QEEUU,D正确。4. 已知二叉树的中序遍历序列是BEDAFHCIG,前序遍历序列是ABDECFHGI,则它的后序遍历序列是( D )A. BDEFHCIGA B. IGHFEDCBAC. EDBFHIGCA D. EDBHFIGCA【解析】 根据二叉树的前序与中序,可画出如图所示的二叉树,再得出后序遍历序列是 EDBHFIGCA。D正确。5. 有如下Python程序段:def f(s): if len(s)==2: return s else: return f(s[len(s)//2+1:]+s[:len(s)//2])print(f("abcde"))当执行该程序段后,显示的结果是( A )A. eb B. beC. da D. ad【解析】 本题考查递归算法及自定义函数知识。f( abcde )→f( deab )→f( bde )→f( eb )。A正确。6. 有如下Python程序段:s = I Love You HangZhou! s1 = for i in range(0, len(s), 3): c = s[i] if ord(c)>= ord( a ): c = chr(ord(c)- ord( a )+ ord( A )) s1 = c + s1print(s1)程序运行后,输出的值是( D )A. OUAZU B. OUAUC. UZAUO D. UAUO【解析】 根据range函数的参数,是从字符串s中从索引0开始,依次取出下标为0、3、6……位置的字符,如果字符是小写,将它转为大写,并按逆序依次拼接。D正确。7. 有如下Python程序段:data= My Name is Tom! imax,t=0,0for ch in data: if ( A <=ch<= Z )or ( a <=ch<= z ): t+=1 else: if t>imax: imax=t t=0print(imax)执行上述代码后,输出的内容是( C )A. 2 B. 3C. 4 D. 5【解析】 本题考查字符串处理知识。根据代码可知,如果是大小写英文字母则计数器t+1,统计连续出现的字母数量(即单词的长度);如果非字母,即空格或感叹号,则取最长单词长度,并将t清0。由于字符串data中最长单词Name的字母数量为4,C正确。8. 有n名同学围成一圈,将同学们从1到n进行编号,然后从1号开始进行报数,报到m(m>1)的同学出局,输出每次出局同学的编号。画线处应填入的代码是( A )que = [0] * 1000n = int(input())m = int(input())tail, head = 0, 0for i in range(1, n + 1): que[tail] = i tail += 1num = 0while head < tail: ① head += 1 num += 1 if num == m: ② num = 0 else: ③ tail += 1A. ①x = que[head] ②print(x, end=" ") ③que[tail] = xB. ①x = que[tail] ②print(x, end=" ") ③que[tail] = xC. ①x = que[head] ②x = que[head] ③print(x, end=" ")D. ①x = que[tail] ②x = que[head] ③print(x, end=" ")【解析】 本题考查队列的基本操作及约瑟夫环问题的模拟思路。本题利用队列的数据结构解决约瑟夫环问题:报数的过程中,每个同学不断出列并入列,但是报到m的同学,出列但不入列,同时输出这个同学的编号。理解思路,并掌握队列的相关代码,可得出A正确。9. 数组元素d[0]至d[n-1]依次存放着n个不重复的升序数据,现需要将值为x的元素删除,例如,n为5,数组d为[2,3,6,8,9],待删除数x为8,删除操作后输出[2,3,6,9]。实现该功能的Python程序如下:d=[2,3,6,8,9]n=len(d)-1;i=0x=int(input("请输入待删除数据:"))while i i+=1for k in range( ① ): ② d=d[:-1]画线处应填入的正确代码是( D )A. ①i+1,n ②d[k+1]=d[k] B. ①i-1,n ②d[k-1]=d[k]C. ①i,n-1 ②d[k]=d[k+1] D. ①i,n ②d[k]=d[k+1]【解析】 本题考查数组元素删除操作。由代码可知,第一个循环先找到值为x的数在列表d中的位置i,然后从位置i开始,自左向右将后面的值往前覆盖,直到最后一个位置n-1,此时数据往前覆盖的表达式为d[k]=d[k+1],D正确。10. 有如下Python程序段:#随机产生10个整型元素的非降序序列,依次存入列表a(a[0]!=a[9]),代码略key=int(input())i=0;j=9n=0while i<=j: m=(i+j)//2 n+=1 if a[m] i=m+1 else: j=m-1执行上述程序段后,下列说法中,错误的是( B )A. a[i+1]可能等于key B. a[j]可能等于keyC. i一定等于j+1 D. n的值一定大于2【解析】 本题考查二分查找算法知识。由于这10个整型元素是非降序序列(相当于可能有相同数据的非严格升序排序),根据代码可知,若找到a[m]=key的值时,下标j向左移动,直到移出key所在的区域,因此循环结束后,a[j]的值肯定小于key,不可能等于key,B符合题意。a[i]的值肯定大于等于key值,若存在多个key值,则 a[i+1]也可能等于key。另外由于该二分查找找到key值后不退出(查找边界条件),因此循环结束后i一定等于j+1,且查找次数肯定大于2。B正确。11. 有如下Python程序段:a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]x=1p=head=2if x==a[p][0]: head=a[p][1]else: while p!=-1: if x==a[p][0]: a[pre][1]=a[p][1] else: pre=p p=a[p][1]运行该段程序后,a[2][1]的值为( D )A. -1 B. 0C. 1 D. 3【解析】 本题考查链表的遍历及删除节点操作。阅读代码可知,选择结构部分的操作为当x为当前链表头指针所指的节点的数据时,就删除头节点,如果不是就遍历后续节点并删除数据域为1的节点。因为删除需要记录当前节点的前驱节点,使用pre来存储。原链表为7→1→1→4→6→1。故删除了数据域为1的节点之后,数据7直接指向了数据4,故a[2][1]为3。D正确。12. 有如下Python程序段:head=4;tail=3a=[3,6,7,12,4]n=len(a)while (head+1)%n!=tail: if a[head]%3!=0: head=(head+1)%n else: a[tail]=a[head]//3 head=(head+1)%n tail=(tail+1)%nprint(a[head])执行上述代码后,输出的内容是( A )A. 2 B. 7C. 3 D. 4【解析】 本题考查循环队列知识。循环队列初始状态队列中有四个元素,从队首到队尾分别为4,3,6,7。当队列中仅剩一个元素时退出循环。第一次循环,a[head]为4,执行if语句第一个分支,队列元素为3,6,7;第二次循环,a[head]为3,执行else语句,队列元素为6,7,1;第三次循环,a[head]为6,执行else语句,队列元素为7,1,2;第四次循环,a[head]为7,执行if语句第一个分支,队列元素为1,2;第五次循环,a[head]为1,执行if语句第一个分支,队列元素为2,此时退出循环。A正确。二、 非选择题(本大题共3小题)13. 近期学校举办了运动会,小李协助老师完成实心球记分员的工作,他提前准备了Python程序,可以将每位运动员的成绩录入并存储。每位运动员均有自己的三位数编号(001—999)。实心球比赛采用三轮投掷模式,即第一轮全部运动员各投掷一次后,再进行第二轮、第三轮。每次运动员投掷后,小李将他的编号和此次成绩存入电脑,存储运动员的成绩时,采用链表结构进行存储。录入的同时,每条记录会按照选手编号进行升序排列。如图所示为小李最后一次输入后的数据截图。请输入运动员编号:592请输入该运动员成绩:13.2head: 13[[623,14.1,35],[766,12.5,39],[253,9.8,33],[277,10.2,42],[537,8.9,4],[674,13.1,31],[452,12.5,34],[176,10.6,40],[251,9.8,32],[831,15.1,-1],[247,8.7,38],[158,9.3,37],[293,10.5,36],[144,11.2,43],[592,14.1,30],[623,13.7,0],[766,9.9,1],[253,10.7,2],[277,10.2,3],[537,9.5,4],[674,11.6,5],[452,10.3,6],[176,10.3,7],[251,10.5,8],[831,14.5,9],[247,10.2,10],[158,10.5,11],[293,10.5,12],[144,13.0,41],[592,13.8,14],[623,14.0,15],[766,10.5,16],[253,10.2,17],[277,11.0,18],[537,11.3,19],[674,12.5,20],[452,13.0,211],[176,11.0,22],[251,9.5,23],[831,14.8,24],[247,9.5,25],[158,10.2,26],[293,9.3,27],[144,14.1,28],[592,13.2,29]]例如,当前数据中,编号最小的运动员位于索引值为13的位置,值为[144,11.2,43],其中144是他的编号,11.2是他这一次的成绩,43是他另一条记录的索引地址。因此,他的另一条记录位于索引值为43的位置,值为[144,14.1,28],他的第三条记录位于索引值为28的位置,值为[144,13.0,41]。录入成绩的Python代码如下,请在画线处填入合适的代码。d=[]head=-1bh=int(input( 请输入运动员编号: ))cj=float(input( 请输入运动员成绩: ))d.append([bh,cj,-1])head,i=0,1while i<=1000: bh=int(input( 请输入运动员编号: )) cj=float(input( 请输入运动员成绩: )) d.append([bh,cj,-1]) p=head if bh head=i d[i][2]=p else: q=d[p][2] while d[q][0] p=q q=d[p][2] d[p][2]=i d[i][2]=q i+=1 print( head: ,head) print(d)【解析】 本题考查链表节点的插入和删除。从图中可知,插入运动员编号为592,出现在列表的最后一个位置,根据题目要求,实现按运动员编号进行升序排列,当输入运动员编号和成绩时,语句d. append([bh,cj,-1])表示先产生一个新的节点,从链表的头节点开始查找运动员编号的位置,如果bh小于头指针的编号d[head][0],把新产生的节点插入到头节点前,作为新的头节点,因此需修改原头节点指针d[i][2]=p,同时修改头指针的值,因此此处应修改为head=i。14. 自从学习了不同进制之后,小明设计了一个计算不同进制数的加法器,并用python编程实现。输入一个加法算式,加数可以是十进制数、二进制数或者十六进制数,程序的功能是输出它们的和。例如,输入形如“1010B+1DH+109D=”的加法算式后,执行程序,输出“和是148”的结果。Python代码如下。请回答下列问题:s=input( 输入一个混合进制的加法算式: )dic={ B :2, D :10, H :16}st=[ ]*100top, i, x, m=-1, 0, 0, 0while i if s[i]== + or s[i]== = : m=① dic[st[top]] top=top-1 t=0 while top!=-1: if st[top]>= A and st[top]<= F : st[top]=ord(st[top])-ord( A )+10 else: st[top]=int(st[top]) ② x=x+st[top]*m**t t=t+1 top=top-1 else: ③ top=top+1 st[top]=s[i] i=i+1print( 和是 ,x)(1)请在画线处填入合适的代码。(2)若输入“1011B+2DH+178D”,则输出的结果是 和是68 。 【解析】 程序可知st列表中保存着当前加数的每一位。如对于式子“1010B+1DH+109D=”,当读到第一个加号时,st列表的值为["1","0","1","0","B"], 读到第二加号时,st的值是 ["1","D","H"],读到最后‘=’号时,st的值是["1", "0","9","D"]。(1)①st列表的最后一位是进制编号,读取st最后一位,通过字典dic得到进制值。②使用权值法把st列表中保存的进制数转换为十进制数。③读取到加数的每一位数字,都保存在st列表中的相应位置。(2)由于式子中的最后一位不是 + 或者 = , 所以st列表中的最后一个数字没有加上。故和是68。15. 一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,那么称该序列为摇摆序列。小王同学想求出某个数列的最长摇摆子序列,以序列[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]。根据图1分析得知,当序列有一段连续的递增(或递减)时,可形成摇摆子序列,我们只需要找到每一次转折中的拐点元素。图1小王编写了一个Python程序实现该功能:程序运行时,输入一串用逗号分隔和结束的数字,可以得到最长摇摆子序列的长度,以及具体的序列。程序运行界面如图2所示。请输入以逗号分隔和结束的数据(不超过20个数):3,14,7,6,9,12,10,8,13,最长摇摆子序列长度为:6最长摇摆子序列为:3,14,6,12,8,13图2(1)若输入数据“2,4,5,3,2,1”,则最长摇摆子序列为 2,5,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 ① ans=str(a[i])+ , +ans return ffor ch in s: if ch == ",": a[i] = int(t); n += 1; i += 1; t = "" else: t = t + chfor i in range(1, n): gd = True if flag == 0: if a[i] > a[i - 1]: flag = 1 elif a[i] < a[i - 1]: flag = 2 else: gd = False elif flag == 1 and a[i] < a[i - 1]: flag = 2 elif ② flag==2 and a[i]>a[i-1] : flag = 1 else: gd = False ③ b[i-1]=gd if f(n)< 3: print("不构成摇摆子序列")else: print("最长摇摆子序列长度为", str(f(n))) print("最长摇摆子序列为:",ans)【解析】 本题考查数组的应用。(2)①其中列表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==2 and a[i]>a[i-1]。③循环中i从1开始进行枚举a数组元素,gd记录是否为拐点,是拐点则为True,否则是False。flag状态未改变则不是拐点,gd值为False。由于flag是摇摆序列的前一次状态,因此状态变换时实际上拐点为i-1,因此此处应填b[i-1]=gd。 展开更多...... 收起↑ 资源列表 综合核心素养测评卷(二)(原卷版).docx 综合核心素养测评卷(二)(解析版).docx