文章

327

粉丝

40

获赞

2

访问

39.6k

头像
2025年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年10月13日 16:33
阅读数 67

void CalMulMax(int A[], int res[], int n) {
    if (n <= 0) return;
    
    // 初始化:从最后一个元素开始
    int max_suffix = A[n-1];
    int min_suffix = A[n-1];
    res[n-1] = A[n-1] * A[n-1];  // 只有一个元素
    
    // 从倒数第二个元素向前遍历
    for (int i = n-2; i >= 0; i--) {
        if (A[i] >= 0) {
            res[i] = A[i] * max_suffix;
        } else {
            res[i] = A[i] * min_suffix;
        }
        
        // 更新后缀最大值和最小值(包含A[i])
        if (A[i] > max_suffix) {
            max_suffix = A[i];
        }
        if (A[i] < min_suffix) {
            min_suffix = A[i];
        }
    }
}

基本思想:从后往前遍历,维护当前后缀的最大值和最小值,根据当前值的正负选择乘最大值或最小值得到结果。

时间复杂度 O(n),空间复杂度 O(1)。

 


评分及理由

(1)得分及理由(满分4分)

得分:2分

理由:学生答案的基本思想部分提到了从后往前遍历,维护后缀最大值和最小值,这是正确的思路。但是学生没有考虑到乘积的最大值可能出现在当前元素本身(比如当A[i]是正数且大于后续所有乘积时),也没有考虑到需要比较多个候选值(当前元素、当前元素乘最大值、当前元素乘最小值)。基本思想描述不够完整,扣2分。

(2)得分及理由(满分7分)

得分:3分

理由:代码实现存在逻辑错误:

  • res[n-1]应该等于A[n-1]本身,而不是A[n-1]的平方,因为题目要求是A[i]与A[j](i≤j)的乘积最大值...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发