文章
91
粉丝
68
获赞
0
访问
5.7k
(1)初始化临时变量m=负无穷,存放乘积结果。两层循环遍历,第一层循环i,依次取出数字个各个数组,第二层循环j 依次从计算该点开始直到最后所有点的乘积(包括自己乘以自己),每次乘积结果如果大于n,则设置n为乘积结果,第二层循环结束后,赋值res[i]
(2)
void calMulMax(int A[ ], int res[ ], int n){
int m = -MAX;
for (int i = 0;i<n;i++)
{
for (int j = i;j<n;j++)
{
if(a[i]*a[j] > m) m= a[i]*a[j];
}
res[i] = m
}
}
(3)时间复杂度O(n^2)和空间复杂度O(1)。
评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想是两层循环遍历,对于每个A[i],遍历j从i到n-1,计算A[i]*A[j]并记录最大值。这种思路是暴力解法,虽然正确,但时间复杂度为O(n²),不符合题目要求的“尽可能高效”。标准答案要求的是O(n)时间复杂度的算法。因此,该设计思想虽然正确,但效率较低,不能得满分。扣2分,得2分。
(2)得分及理由(满分7分)
学生根据其设计思想给出了代码实现,但存在多处错误:
1. 变量名不一致:函数参数为`A`和`res`,但代码中使用了`a`(第6行),这是未定义的变量,属于语法错误。
2. 初始化错误:`m = -MAX`,`MAX`未定义,应为`INT_MIN`或类似的最小整数值。
3. 逻辑错误:变量`m`在每次外层循环后未重置,导致后续`res[i]`的计算会累积之前循环的最大值,结果错误。例如,对于A[]={1,4,-9,6},按照此代码,res[0]计算正确为6,但res[1]会从m=6开始比较,最终得到24,看似正确,但这是巧合;若A[0]的乘积最大值小于A[1]的某个乘积但大于A[1]自身乘积,就会出错。
4. 缺少必要的头文件或常量定义(如`INT_MIN`)。
由于存在严重的逻辑和语法错误,代码不能正确实现功能。扣5分,得2分。
(3)得分及理由(满分2分)
学生正确分析了其算法的时间复杂度为O(n²)和空间复杂度为O(1)。虽然算法不是最优,但复杂...
登录后发布评论
暂无评论,来抢沙发