文章
148
粉丝
0
获赞
0
访问
16.8k

评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想是:先遍历数组A找到全局最大值max和最小值min,然后再次遍历数组,根据A[i]的正负性分别与max或min相乘得到res[i]。这一思路与标准答案(从右向左遍历并动态维护i到n-1子数组的最大最小值)不同,但学生的思路在逻辑上存在错误。因为题目要求对于每个A[i],需要找到j≥i的A[j]使得乘积最大,而学生的做法是使用全局的max和min,这可能导致j
(2)得分及理由(满分7分)
学生根据设计思想写出了代码,但存在以下问题:
1. 初始化max=0,min=99999(或999999)不合理。若数组所有元素都小于0,则max初始0会导致找不到真正的最大值(例如A全为负数,max保持0,但实际最大值应为负数);同样,若数组所有元素都大于99999,min初始化过小也可能出错。应使用INT_MIN和INT_MAX或数组第一个元素初始化。
2. 第一个for循环中,if语句没有用大括号括起来,只有第一个if属于循环体,第二个if实际上在循环体外(根据C/C++语法,循环体只包含紧随的一条语句),这会导致逻辑错误,min只在最后一次比较后更新(实际识别文本中两个if是并列的,但根据缩进和常见误写,可能学生意图是两者都在循环内,但代码书写不规范)。
3. 算法逻辑错误同(1),使用了全局极值而非i到n-1子数组的极值。
由于代码存在明显的逻辑错误和初始化问题,但整体结构符合其设计思想,且核心操作(两次遍历、根据正负选择乘数)正确表达了其思路,故酌情扣分。得分:3分。
(3)得分及理由(满分2分)
学生给出的时间复杂度O(n)和空间复杂度O(1)是正确的,因为算法进行了两次遍历,使用常数个额外变量。尽管算法逻辑有误,但复杂度分析基于其给出的算法步骤是正确的。因此不扣分。得分:2分。
题目总分:2+3+2=7分
登录后发布评论
暂无评论,来抢沙发