深耕专业教研,探索前沿技术
信息技术来源:宁波市 2025 学年第二学期高考模拟考试

第 12 题

答案与解析

本题解析

参考答案

A

程序分析

m = len(a)
n = len(a[0])
i,j = 0,n-1
cnt = 0
while i < m and j >= 0:
    if a[i][j] < 0:
        ①
        ②
    else:
        ③
return cnt

m、n分别为矩阵的行数和列数,i、j分别是当前访问的行、列下标,初始位置(0,n−1)位于右上角。循环条件要求i < m且j >= 0,循环内根据当前元素是否小于0选择分支。结合统计负数个数的题意和最后返回cnt,可知cnt需要保存累计的负数个数。

每行、每列均为非升序,向右或向下数值不会增大,可以利用当前元素判断一行或一列中的一部分元素。

填空分析

①

从右上角开始,将第i至m−1行、第0至j列作为尚未处理的区域。当a[i][j] < 0时,第j列从第i行往下的元素都不大于它,因此全是负数。需要累计的个数为(m−1)−i+1=m−i,包含当前元素,应填写cnt += m-i。这里统计的是同一列中的行数,不能用列数n−j,也不能漏掉当前行。

②

第j列在尚未处理区域内的负数已全部计入,再检查这一列会重复计数。因此移到左侧一列,继续处理剩余区域,填写j -= 1,行下标i保持不变。

③

进入else分支说明a[i][j] >= 0,包括等于0的情况。由于该行从左向右非升序,第0至j列的元素都不小于a[i][j],本行尚未处理的元素中没有负数。应跳过这一行,填写i += 1,列下标j保持不变。