信息技术来源: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 += 1j每次向右移动一位,将新元素纳入考察范围。新元素为0时num增加1,为1时不变,因此这一处更新只累计新加入的0。
while num > k:
if a[i] == 0:
num -= 1
i += 1num超过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。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_hangerkaixue_q012
