文章
117
粉丝
38
获赞
0
访问
22.1k

评分及理由
(1)得分及理由(满分4分)
学生作答的基本设计思想是:先遍历一次数组找出全局最大值和最小值,然后再次遍历数组,对于每个元素 A[i],若 A[i] ≤ 0 则乘以全局最小值,若 A[i] > 0 则乘以全局最大值,结果存入 res[i]。
然而,这个思路是错误的。因为题目要求的是对于每个 A[i],计算 A[i] 与 A[j](i ≤ j ≤ n-1)乘积的最大值,即只考虑 i 及其右侧的元素。学生的做法使用了全局的最大最小值,忽略了 j 必须 ≥ i 的限制,因此逻辑错误。
例如,对于 A = {1, 4, -9, 6},按照学生的算法:全局最大值 max=6,全局最小值 min=-9。计算 res[0] 时,A[0]=1>0,res[0]=1*6=6(正确,但这是巧合,因为全局最大值恰好在右侧);计算 res[1] 时,A[1]=4>0,res[1]=4*6=24(正确,巧合);计算 res[2] 时,A[2]=-9≤0,res[2]=-9*(-9)=81(正确,巧合,因为全局最小值恰好在右侧且就是自身);计算 res[3] 时,A[3]=6>0,res[3]=6*6=36(正确,巧合)。虽然这个例子巧合地得到了正确结果,但算法本身是错误的。考虑另一个例子 A = {5, -1, 2},正确结果应为 res = {10, -2, 2}(因为对于 i=0,最大乘积是 5*2=10;i=1,最大乘积是 -1*(-1)=1 或 -1*2=-2,取最大值 1?等等,这里需要仔细计算:对于 i=1,A[1]=-1,右侧元素有 -1 和 2,乘积分别为 1 和 -2,最大值是 1;但学生的算法:全局最大值 max=5,全局最小值 min=-1,res[0]=5*5=25(错误,应为 10),res[1]=-1*(-1)=1(正确),res[2]=2*5=10(错误,应为 2)。显然错误。
因此,学生的设计思想存在逻辑错误,不能得分。扣4分。
得分:0分
(2)得分及理由(满分7分)
学生根据错误的设计思想写出了代码。代码本身语法正确,但算法逻辑错误,原因同上:没有考虑 j 必须 ≥ i 的限制,错误地使用了全局最大最小值。
由于设计思想错误,代码实现也错误,因此不能得分。扣7分。
得分:0分
(3)得分及理由(满分2分)
学生给出的时间复杂度 O(n) ...
登录后发布评论
暂无评论,来抢沙发