资源简介 (共23张PPT)一、数组及其基本操作(A)第二章 数组与链表信息技术 选择性必修1 数据与数据结构必备知识练1. (2023·杭州周边重点学校联考)有如下Python程序段:a=[18,2,-1,-7,16,-2,12,8]k1,k2=1,1for i in range(len(a)): if a[i]>a[k1]: k2=k1;k1=i elif a[i]>a[k2]: k2=i该程序段运行后,变量k1,k2的值分别为( )A. 2,5 B. 4,0C. 5,2 D. 0,4【解析】 本题考查程序数组知识。分析代码可知,k1是最大数的下标,k2是第二大数的下标,D正确。D2. 有一组正整数,要求对其中的奇数和偶数进行交换。交换后奇数在前,偶数在后,并保持相对顺序不变。请在画线处填入合适的代码。下列选项中,正确的是( )import randoma=[];n = 10for i in range(n): a.append(random.randint(1,100))b=[0]*nnum=0k=0while k if ① : b[num]=a[k] num+=1 else: ② k+=1for j in ③ : a[j]=b[j- n + num]print(a)A. ①a[k]%2==0 ②a[k-num]=a[k] ③range(n-num,n)B. ①a[k]%2==1 ②b[k-num]=a[k] ③range(n-num-1,n)C. ①a[k]%2==1 ②a[k-num]=a[k] ③range(n-num-1,n)D. ①a[k]%2==0 ②b[k-num]=a[k] ③range(n-num,n)A【解析】 本题考查列表及排序知识。本题实质是列表a中的原始数据,借助于列表b(用于存储偶数),而处理后列表a的前段用于存储原始数据中的奇数。最后再将列表b中的偶数存到列表a的后段。其中变量num记录偶数的个数,k记录当前读取原列表a中的位置,k-num记录向原列表a存取奇数的位置,n-num则表示奇数的个数。例如n=6时,原始数据列表a是[1,4,2,7,5,8]。先将“1,7,5”存入列表a的前三位,而b=[4,2,8,0,0,0],后面的循环for j in range(n-num,n),其作用是将列表b中的偶数再按顺序写入列表a的后半段,此时num=3,n=6,将b[j-n+num]存入a[j],因此最后就得到a列表为[1,7,5,4,2,8],从而实现了目的。A正确。3. (2024·嵊州模拟)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将下标为x(0≤x≤n-1)的元素在逻辑上删除,例如,n为5,数组a为[1,3,5,7,9],x为2,进行删除操作后,输出[1,3,7,9]。实现该功能的程序段如下,画线处应填入的代码是( ) a=[1,3,5,7,9] n=len(a) x=2 for i in range( ① ): ② print(a[:-1])A. ①x,n ②a[i-1]=a[i]B. ①n-x ②a[i-1]=a[i]C. ①x,n ②a[i]=a[i+1]D. ①x-n,-1 ②a[i]=a[i+1]【解析】 本题考查数组元素删除操作。要从数组中删去索引为2的值,需要将[x+1,n-1]范围内的值向前移动1位,②处为移数操作,若为a[i-1]=a[i],则①处应填x+1,n,A、B错误。②若为a[i]=a[i+1],①处应填:x,n-1,C错误。那么应该是采用了负索引,D正确。D4. 有n盏灯,一开始全部处于关闭状态,现有n个人对这些灯进行操作:第1个人将所有灯打开,第2个人将所有编号为2的倍数的灯全部关闭,第3个人对所有编号为3的倍数的灯进行反向操作……直到第n个人操作完成。该过程用如下的Python程序段进行模拟:n=int(input())a=[0]*(n+1) #数组a初始值全为0,灯的状态:0为关,1为开 for i in range(1,n+1): for j in range(i,n+1): if ① : ② 画线处应填入的代码是( )A. ① j % i == 0 ② a[j] = 1 - a[j] B. ① i % j == 0 ② a[j] = 1 - a[j]C. ① j % i == 0 ② a[i] = 1 - a[i]D. ① i % j == 0 ② a[i] = 1 - a[i]【解析】 本题考查数组知识。根据代码i、j的范围可知,外循环i枚举人,内循环j枚举灯,灯的状态由a[j]来记录,A正确。A5. (2024·杭州二模)有如下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(k-2)与abs(a[j]-2),最终是按abs(a[j]-2)升序排序,即最后每个数据项减2的绝对值应为升序。4个选项结果如下表所示: A B C D原始值 -5,-2,4, 0,1 3,-1,0, 2,-3 1,2,3, 4,5 0,4,0,-2,-4-2 -7,-4,2, -2,-1 1,-3,-2, 0,-5 -1,0,1, 2,3 -2,2,-2,-4,-6求绝对值 7,4,2,2,1 1,3,2,0,5 1,0,1,2,3 2,2,2,4,6综上所述,D正确。6. (2024·温州三模)有如下Python程序段:from random import randints,i,ans =1,0,0k=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. 5C. 6 D. 7A【解析】 本题考查数组的相关知识。由于k的取值最大为24,s累乘=2*3*4=24,此时ans累加已经等于6。当s大于等于k的时候i才会加1,s=24/2=12*5=60/3=20,i等于1和2,所以ans=6有可能;若取20,s=20>=20会再增加一次i=3,此时ans=6-3-3+1,故7也有可能;再考虑取最小值k=10的情况,ans的值为5。A符合题意。7. 有如下Python程序段:a=[0]*10for i in range(16): j=0;a[j]=a[j]+1 while a[j]==3: a[j]=0 j=j+1 a[j]=a[j]+1执行该程序段后,数组a中各元素之和为( )A. 2 B. 3C. 4 D. 5C【解析】 本题考查两重循环和数组运算的知识。经过模拟可知,执行该程序段后,a[0]的值为1,a[1]的值为2,a[2]的值为1,其他元素值均为0,故各元素之和的值为4。该程序段的本质是外循环一共进行15次,而每三次外循环都会触发一次内循环,产生进位,故本题的本质是模拟了三进制的进位规则。(121)3=1*32+2*31+1*30=15,从而得到验证。C正确。关键能力练8. 有如下Python程序段:import randoma=[0]*6for i in range(1,6): tmp=random.randint(5,24) if tmp%2==0 or i%2==1: a[i]=a[i-1]+tmpprint(a)运行程序后,数组a的值可能的是( )A. [0, 9, 29, 50, 0, 20] B. [8, 20, 44, 62, 86, 109]C. [0, 8, 14, 21, 39, 0] D. [0, 10, 24, 43, 0, 30]【解析】 本题考查数组及随机数知识。分析代码,a[0]元素一定是0,B错误。奇数位上的数一定不为0,C错误。和前面偶数位上的数相差不会超过24,D错误。A9. 有如下Python程序段:a = [0]*10s = "2024.09.19 Good Luck!"; n = 0for i in range(len(s)): if "0"<=s[i] <= "9": m = ord(s[i])- ord("0") a[m] = a[m] + 1 for i in range(10): if a[i] > 1: n = n + 1print(n)执行该程序段后,输出n的值为( )A. 2 B. 3C. 4 D. 5【解析】 本题考查循环和数组运算知识。由代码可知,程序的目的是统计字符串s中两个以上的数字字符数量(不统计其他字符),算法中使用了桶的概念。观察可知,数字字符“0”“2”“9”的数量都在两个以上,故答案是3,B正确。B10. 有如下Python程序段:from random import randintd=[]; k=0; i=0while i<=4: b=randint(0,9) # 随机产生一个[0,9]之间的整数 if b not in d: d.append(b) # 在数组a末尾增加元素b i+=1for i in range(len(d)): if d[i]%2==0: k+=1 else: d[i-k]=d[i]print(d)执行该程序段后,输出的数组d不. 可. 能. 为( )A. [7,9,1,1,8] B. [7,5,9,5,9]C. [9,7,4,7,1] D. [5,1,0,5,1]【解析】 本题考查随机数及逻辑判断知识。由while循环代码可知,数组d是一个由5个元素组成的位于[0,9]之间的不重复数据,其中k记录偶数的个数,代码d[i-k]=d[i]的意思是,若a[i]是奇数则将覆盖前面的偶数元素。[9,7,4,7,1]中有两个7,说明已经有一个偶数被覆盖,然后又有元素4,故有两个偶数,k=2,这样最后的奇数元素1一定将元素4覆盖,C符合题意。C11. 有一个整型的数组a,要求删除其中的某个元素x(若存在重复的数据,则删除第一个),实现上述功能的Python代码如下,运行界面如图所示。a=[17,10,13,1,9]print("原始数据为:",a)x = int(input("请输入待删除数:"))n=len(a)-1k = 0for i in range(①__________): if ②__________: k = i breakfor i in range(k,n): ③_______________ a=a[:n]print("删除后数据:",a)请回答下列问题:(1)请在画线处填入合适的代码。(2)若删除加框处的代码,则程序功能上的改变是___________________________________。 原始数据:[17,10,13,1,9]请输入待删除数:13删除后数据:[17,10,1,9]n+1a[i]==xa[i]=a[i+1]若有重复数据,删除的是最后一个数据【解析】 本题考查数组数据的删除。(1)若要删除数组中间某个位置的数据,需要移动较多的数据(若删除数组末尾的数据,则不需要移动其他数据)。①由下文代码“k=i”可知,k应该是待删除数据x在数组a中的索引号,而n=len(a)-1,所以遍历的范围应该是0~n,故答案是n+1。②此处查找待删除数x在数组a中的索引号,故答案是a[i]==x。③此处是删除索引号为k的数据的核心代码,将k后面的数据依次往前覆盖,故代码是a[i]=a[i+1]。(2)若删除break语句,其他功能不变,但找到重复数据的最后一个索引号k,故删除的是最后一个数据。12. 某农科院将试验田自左向右分为 m块地(编号依次为0~m-1),每块地配置一个喷灌装置。灌溉系统定期测量所有地块的水量(非负整数),然后自左起地块开始检查:若某地块当前水量值小于1则开启喷灌:自身水量增加2、左右相邻地块水量各增加1,随后关闭喷灌装置;接着进行下去,直到m块地的水量均不小于1。(1)若m=12,灌溉系统某次测量中,编号0~11的各地块的水量值依次为0,0,1,2,1,0,1,0,2,1,1,0,则需开启喷灌装置的数量为__________。 4(2)模拟上述功能的部分Python程序如下,请在画线处填入合适的代码。while True: #定期测量编号为0~m-1的各块地的水量值,依次存入a[0]~a[m-1] i = 0 while i < n: if ①__________: #开启灌溉,代码略 if i ==0: a[i + 1] += 1 elif i < n - 1: a[i - 1] += 1 a[i + 1] += 1 else : a[i - 1] += 1 ②__________________ #关闭喷灌装置,代码略 i = i + 2 else: ③____________ a[i]==0a[i]=a[i]+2i=i+1【解析】 本题考查基础python算法。(1)结合题意可知,从前向后遍历数组,遇到0时开启灌溉装置,数组有5个0,除了第2个0不会开启,其余都会,故4次。(2) ①依题意,当a[i]==0时开启灌溉。②在处理完左右相邻数据后,“自身水量增加2”,此处填a[i]=a[i]+2。③若开启灌溉装置,由于相邻数据都加了1,故可直接向右跳两步;若不开启,则向右跳一步,故答案是i=i+1。一、数组及其基本操作(A)1. (2023·杭州周边重点学校联考)有如下Python程序段:a=[18,2,-1,-7,16,-2,12,8]k1,k2=1,1for i in range(len(a)): if a[i]>a[k1]: k2=k1;k1=i elif a[i]>a[k2]: k2=i该程序段运行后,变量k1,k2的值分别为( D )A. 2,5 B. 4,0C. 5,2 D. 0,4【解析】 本题考查程序数组知识。分析代码可知,k1是最大数的下标,k2是第二大数的下标,D正确。2. 有一组正整数,要求对其中的奇数和偶数进行交换。交换后奇数在前,偶数在后,并保持相对顺序不变。请在画线处填入合适的代码。下列选项中,正确的是( A )import randoma=[];n = 10for i in range(n): a.append(random.randint(1,100))b=[0]*nnum=0k=0while k if ① : b[num]=a[k] num+=1 else: ② k+=1for j in ③ : a[j]=b[j- n + num]print(a)A. ①a[k]%2==0 ②a[k-num]=a[k] ③range(n-num,n)B. ①a[k]%2==1 ②b[k-num]=a[k] ③range(n-num-1,n)C. ①a[k]%2==1 ②a[k-num]=a[k] ③range(n-num-1,n)D. ①a[k]%2==0 ②b[k-num]=a[k] ③range(n-num,n)【解析】 本题考查列表及排序知识。本题实质是列表a中的原始数据,借助于列表b(用于存储偶数),而处理后列表a的前段用于存储原始数据中的奇数。最后再将列表b中的偶数存到列表a的后段。其中变量num记录偶数的个数,k记录当前读取原列表a中的位置,k-num记录向原列表a存取奇数的位置,n-num则表示奇数的个数。例如n=6时,原始数据列表a是[1,4,2,7,5,8]。先将“1,7,5”存入列表a的前三位,而b=[4,2,8,0,0,0],后面的循环for j in range(n-num,n),其作用是将列表b中的偶数再按顺序写入列表a的后半段,此时num=3,n=6,将b[j-n+num]存入a[j],因此最后就得到a列表为[1,7,5,4,2,8],从而实现了目的。A正确。3. (2024·嵊州模拟)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将下标为x(0≤x≤n-1)的元素在逻辑上删除,例如,n为5,数组a为[1,3,5,7,9],x为2,进行删除操作后,输出[1,3,7,9]。实现该功能的程序段如下,画线处应填入的代码是( D ) a=[1,3,5,7,9] n=len(a) x=2 for i in range( ① ): ② print(a[:-1])A. ①x,n ②a[i-1]=a[i]B. ①n-x ②a[i-1]=a[i]C. ①x,n ②a[i]=a[i+1]D. ①x-n,-1 ②a[i]=a[i+1]【解析】 本题考查数组元素删除操作。要从数组中删去索引为2的值,需要将[x+1,n-1]范围内的值向前移动1位,②处为移数操作,若为a[i-1]=a[i],则①处应填x+1,n,A、B错误。②若为a[i]=a[i+1],①处应填:x,n-1,C错误。那么应该是采用了负索引,D正确。4. 有n盏灯,一开始全部处于关闭状态,现有n个人对这些灯进行操作:第1个人将所有灯打开,第2个人将所有编号为2的倍数的灯全部关闭,第3个人对所有编号为3的倍数的灯进行反向操作……直到第n个人操作完成。该过程用如下的Python程序段进行模拟:n=int(input())a=[0]*(n+1) #数组a初始值全为0,灯的状态:0为关,1为开 for i in range(1,n+1): for j in range(i,n+1): if ① : ② 画线处应填入的代码是( A )A. ① j % i == 0 ② a[j] = 1 - a[j] B. ① i % j == 0 ② a[j] = 1 - a[j]C. ① j % i == 0 ② a[i] = 1 - a[i]D. ① i % j == 0 ② a[i] = 1 - a[i]【解析】 本题考查数组知识。根据代码i、j的范围可知,外循环i枚举人,内循环j枚举灯,灯的状态由a[j]来记录,A正确。5. (2024·杭州二模)有如下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的值可能是( D )A. [-5,-2,4,0,1] B. [3,-1,0,2,-3]C. [1,2,3,4,5] D. [0,4,0,-2,-4]【解析】 本题考查插入排序思想。本题是插入排序升序的典型代码,变式在于比较的不是原始数据,而是abs(k-2)与abs(a[j]-2),最终是按abs(a[j]-2)升序排序,即最后每个数据项减2的绝对值应为升序。4个选项结果如下表所示:A B C D原始值 -5,-2,4, 0,1 3,-1,0, 2,-3 1,2,3, 4,5 0,4,0, -2,-4-2 -7,-4,2, -2,-1 1,-3,-2, 0,-5 -1,0,1, 2,3 -2,2,-2, -4,-6求绝对值 7,4,2,2,1 1,3,2,0,5 1,0,1,2,3 2,2,2,4,6综上所述,D正确。6. (2024·温州三模)有如下Python程序段:from random import randints,i,ans =1,0,0k=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 )A. 4 B. 5C. 6 D. 7【解析】 本题考查数组的相关知识。由于k的取值最大为24,s累乘=2*3*4=24,此时ans累加已经等于6。当s大于等于k的时候i才会加1,s=24/2=12*5=60/3=20,i等于1和2,所以ans=6有可能;若取20,s=20>=20会再增加一次i=3,此时ans=6-3-3+1,故7也有可能;再考虑取最小值k=10的情况,ans的值为5。A符合题意。7. 有如下Python程序段:a=[0]*10for i in range(16): j=0;a[j]=a[j]+1 while a[j]==3: a[j]=0 j=j+1 a[j]=a[j]+1执行该程序段后,数组a中各元素之和为( C )A. 2 B. 3C. 4 D. 5【解析】 本题考查两重循环和数组运算的知识。经过模拟可知,执行该程序段后,a[0]的值为1,a[1]的值为2,a[2]的值为1,其他元素值均为0,故各元素之和的值为4。该程序段的本质是外循环一共进行15次,而每三次外循环都会触发一次内循环,产生进位,故本题的本质是模拟了三进制的进位规则。(121)3=1*32+2*31+1*30=15,从而得到验证。C正确。8. 有如下Python程序段:import randoma=[0]*6for i in range(1,6): tmp=random.randint(5,24) if tmp%2==0 or i%2==1: a[i]=a[i-1]+tmpprint(a)运行程序后,数组a的值可能的是( A )A. [0, 9, 29, 50, 0, 20]B. [8, 20, 44, 62, 86, 109]C. [0, 8, 14, 21, 39, 0]D. [0, 10, 24, 43, 0, 30]【解析】 本题考查数组及随机数知识。分析代码,a[0]元素一定是0,B错误。奇数位上的数一定不为0,C错误。和前面偶数位上的数相差不会超过24,D错误。9. 有如下Python程序段:a = [0]*10s = "2024.09.19 Good Luck!"; n = 0for i in range(len(s)): if "0"<=s[i] <= "9": m = ord(s[i])- ord("0") a[m] = a[m] + 1 for i in range(10): if a[i] > 1: n = n + 1print(n)执行该程序段后,输出n的值为( B )A. 2 B. 3C. 4 D. 5【解析】 本题考查循环和数组运算知识。由代码可知,程序的目的是统计字符串s中两个以上的数字字符数量(不统计其他字符),算法中使用了桶的概念。观察可知,数字字符“0”“2”“9”的数量都在两个以上,故答案是3,B正确。10. 有如下Python程序段:from random import randintd=[]; k=0; i=0while i<=4: b=randint(0,9) # 随机产生一个[0,9]之间的整数 if b not in d: d.append(b) # 在数组a末尾增加元素b i+=1for i in range(len(d)): if d[i]%2==0: k+=1 else: d[i-k]=d[i]print(d)执行该程序段后,输出的数组d不可能为( C )A. [7,9,1,1,8] B. [7,5,9,5,9]C. [9,7,4,7,1] D. [5,1,0,5,1]【解析】 本题考查随机数及逻辑判断知识。由while循环代码可知,数组d是一个由5个元素组成的位于[0,9]之间的不重复数据,其中k记录偶数的个数,代码d[i-k]=d[i]的意思是,若a[i]是奇数则将覆盖前面的偶数元素。[9,7,4,7,1]中有两个7,说明已经有一个偶数被覆盖,然后又有元素4,故有两个偶数,k=2,这样最后的奇数元素1一定将元素4覆盖,C符合题意。11. 有一个整型的数组a,要求删除其中的某个元素x(若存在重复的数据,则删除第一个),实现上述功能的Python代码如下,运行界面如图所示。原始数据:[17,10,13,1,9]请输入待删除数:13删除后数据:[17,10,1,9]a=[17,10,13,1,9]print("原始数据为:",a)x = int(input("请输入待删除数:"))n=len(a)-1k = 0for i in range(① n+1 ): if ② a[i]==x : k = i breakfor i in range(k,n): ③ a[i]=a[i+1] a=a[:n]print("删除后数据:",a)请回答下列问题:(1)请在画线处填入合适的代码。(2)若删除加框处的代码,则程序功能上的改变是 若有重复数据,删除的是最后一个数据 。 【解析】 本题考查数组数据的删除。(1)若要删除数组中间某个位置的数据,需要移动较多的数据(若删除数组末尾的数据,则不需要移动其他数据)。①由下文代码“k=i”可知,k应该是待删除数据x在数组a中的索引号,而n=len(a)-1,所以遍历的范围应该是0~n,故答案是n+1。②此处查找待删除数x在数组a中的索引号,故答案是a[i]==x。③此处是删除索引号为k的数据的核心代码,将k后面的数据依次往前覆盖,故代码是a[i]=a[i+1]。(2)若删除break语句,其他功能不变,但找到重复数据的最后一个索引号k,故删除的是最后一个数据。12. 某农科院将试验田自左向右分为 m块地(编号依次为0~m-1),每块地配置一个喷灌装置。灌溉系统定期测量所有地块的水量(非负整数),然后自左起地块开始检查:若某地块当前水量值小于1则开启喷灌:自身水量增加2、左右相邻地块水量各增加1,随后关闭喷灌装置;接着进行下去,直到m块地的水量均不小于1。(1)若m=12,灌溉系统某次测量中,编号0~11的各地块的水量值依次为0,0,1,2,1,0,1,0,2,1,1,0,则需开启喷灌装置的数量为 4 。 (2)模拟上述功能的部分Python程序如下,请在画线处填入合适的代码。while True: #定期测量编号为0~m-1的各块地的水量值,依次存入a[0]~a[m-1] i = 0 while i < n: if ① a[i]==0 : #开启灌溉,代码略 if i ==0: a[i + 1] += 1 elif i < n - 1: a[i - 1] += 1 a[i + 1] += 1 else : a[i - 1] += 1 ② a[i]=a[i]+2 #关闭喷灌装置,代码略 i = i + 2 else: ③ i=i+1 【解析】 本题考查基础python算法。(1)结合题意可知,从前向后遍历数组,遇到0时开启灌溉装置,数组有5个0,除了第2个0不会开启,其余都会,故4次。(2) ①依题意,当a[i]==0时开启灌溉。②在处理完左右相邻数据后,“自身水量增加2”,此处填a[i]=a[i]+2。③若开启灌溉装置,由于相邻数据都加了1,故可直接向右跳两步;若不开启,则向右跳一步,故答案是i=i+1。 展开更多...... 收起↑ 资源列表 一、数组及其基本操作(A).docx 一、数组及其基本操作(A).pptx