文章
35
粉丝
0
获赞
0
访问
1.5k
评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想是:用一次循环找出A与B中第⌈n/2⌉个大的数,作为中位数。但这种方法实际上是通过合并两个有序数组并取第n小的数(因为总长度为2n,中位数是第n小的数),但代码实现中只循环了n次,且每次比较当前A和B的最小值,取较小的那个,这样实际上是在找两个有序数组合并后的前n个最小数中的最后一个(即第n小的数),这符合中位数的定义。思路正确,但描述不够精确(没有明确说明是合并过程中找第n小的元素)。因此扣1分。得3分。
(2)得分及理由(满分9分)
学生代码试图通过一次循环遍历,每次比较A和B当前最小元素,取较小者,并移动指针,循环n次后返回的temp应该是第n小的数(即中位数)。但代码存在逻辑错误:
1. 循环条件为i < n,但循环内每次只取一个元素,这样确实会取到第n小的数(因为循环n次后,a和b指针移动次数之和为n,但实际合并数组的前n个元素并不一定是严格递增的?因为这里没有真正合并,只是模拟取最小)
2. 但是,当a或b指针越界时(即一个数组全部被取完),代码没有处理。例如,如果A数组所有元素都小于B数组,那么当a达到n时,再访问A[a]就会越界。学生代码没有考虑这种情况,因此代码不完整,有严重错误。
3. 另外,中位数应该是第n小的数(因为总长度2n,中位数是第n个),但代码中循环n次后temp确实是第n次选择的数(即第n小的数),这一点正确。
但由于指针越界问题未处理,代码不能正确运行。因此扣5分(逻辑错误严重)。得4分。
(3)得分及理由(满分2分)
学生正确分析了时间复杂度为O(n)和空间复杂度为O(1),与标准答案的O(log n)不同,但学生的方法(如果正确实现)确实是O(n)时间,因此这里不扣分。得2分。
题目总分:3+4+2=9分
登录后发布评论
暂无评论,来抢沙发