文章

281

粉丝

40

获赞

2

访问

23.8k

头像
2025年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年9月23日 20:46
阅读数 38

void CallMulMax(int A[], int res[],int n){
if(n == 0)return;

int max_val = 0;
int imax_val = 0;

for(int i = n-1; i >= 0; i--){

if(A[i] > 0 && A[i] > max_val){
max_val = A[i];
res[i] = A[i]*max_val;
}

if(A[i] < 0 && abs(A[i]) > abs(imax_val)){
imax_val = A[i];
res[i] = A[i]*imax_val;
}

if(A[i] = 0)res[i] = 0;

}

}

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

算法思想:
因为题设要求的是求从A[i]与直到A[n-1]的数相乘所得的最大值,所以我们从右往左遍历
我们只需要维护这个过程中得到的正负数分别的绝对值最大的数max_val和imax_val
当A[i]是大于0的,那么res[i]的最大值 = A[i]乘以max_val
当A[i]是小于0的,那么res[i]的最大值 = A[i]乘以imax_val
当A[i]是等于0的,那么res[i]乘以任何数的结果都是0

 


评分及理由

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

得分:1分

理由:学生理解了需要从右向左遍历的基本方向,并且提到了维护正负数的概念。但是算法思想存在严重缺陷:

  • 错误地认为只需要维护绝对值最大的正数和负数
  • 没有考虑到乘积的最大值可能是当前数与后续最大值的乘积,也可能是与后续最小值的乘积
  • 对于负数相乘得到正数的情况处理不正确
  • 思路不完整,无法正确解决所有情况

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

得分:2分

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

  • max_val和imax_val初始化为0是错误的,应该用数组最后一个元素初始化
  • 条件判断逻辑错误:只有当A[i]大于当前最大值时才更新,忽略了其他可能情况
  • res[i]的计算错误:没有考虑多种候选值取最大值
  • 第3个if语句中"A[i] = 0"是赋值操作而非比较,这是严重语法错误
  • 没有正确...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发