深耕专业教研,探索前沿技术
信息技术来源:2026年3月杭州二中高三开学适应性考试

第 12 题

答案与解析

本题解析

参考答案

D

程序分析

a = [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1]
k = 2
ans = 0
num = 0
i = 0
for j in range(len(a)):
    if a[j] == 0:
        ...
    while num > k:
        ...
    if j - i + 1 > ans:
        ...

k设为2,ans、num和i初值均为0。外层循环让j从左到右访问列表,每轮依次执行读入当前元素、按条件调整i、比较区间长度这三个步骤。

if a[j] == 0:
    num += 1

j每次向右移动一位,将新元素纳入考察范围。新元素为0时num增加1,为1时不变,因此这一处更新只累计新加入的0。

while num > k:
    if a[i] == 0:
        num -= 1
    i += 1

num超过2时,i不断右移,逐个移除左端元素;只有移除的a[i]为0时才让num减1。结合前面对新元素的计数,num记录的就是当前闭区间a[i]至a[j]内0的个数,i、j分别是区间的左右端点。循环结束时,该区间至多含2个0。

if j - i + 1 > ans:
    ans = j - i + 1

闭区间两端都要计入,故长度为j-i+1。只有本轮调整后的区间更长时才更新ans,因此ans保留已经找到的最大合法区间长度。

整体功能

程序用左右端点移动的方式维护一个至多含2个0的连续区间,并求这类区间的最大长度。

按右端点j的变化,关键过程如下:

j的位置 区间调整 调整后的左端点i 当前区间长度 ans
0~4 尚未超过2个0,无须缩短 0 从1增至5 从1增至5
5 加入第3个0,依次移除下标0、1、2处的元素,直到移除一个0 3 3 5
6~8 新加入的均为1,继续向右扩展 3 从4增至6 最终增至6
9 又加入一个0,依次移除下标3、4处的元素,直到移除一个0 5 5 6
10 加入1,无须缩短 5 6 6

例如下标3~8对应的[1,0,0,1,1,1]长为6,且恰含2个0。遍历结束后没有出现更长的合法区间,输出ans为6。