文章
79
粉丝
0
获赞
0
访问
3.6k
1)使用哈希表进行存储,将数组遍历一次,把相应的元素作为key存放到哈希表里,然后相应位置的值+1,例如创建数组hash_min[], 数组{-5, 3, 2, 3},可以将大于0的元素,例如3,放进hash_min[3]++。接着遍历hash_min,找到第一个为0的key,那个就是最小未出现正整数。
2) 见下代码
3)O(n)时间复杂度, O(n)空间复杂度
#define MAXINT 2147485555 // 假设为int最大值
int findSmallest(int nums[], int size){
int res = 0;
int hash_min[MAXINT];
for(int i = 0; i< size; ++i){
if(nums[i] >= 0) hash_min[nums[i]]++;
}
for(int i = 0; i < MAXINT; ++i){
if(hash_min[i] == 0){
res = i+1;
break;
}else res++;
}
return res+1;
}
评分及理由
(1)得分及理由(满分3分)
得1分。学生提出了使用哈希表存储的基本思想,这确实是解决该问题的一种可行方法。但是,该设计存在严重缺陷:哈希表的大小被设置为MAXINT(2147485555),这在实际应用中是不可行的,因为数组大小n可能远小于这个值,导致巨大的空间浪费。此外,算法没有正确处理正整数范围(应为1到n或n+1),且未考虑负数和零的处理。虽然思路正确,但设计不切实际,因此扣2分。
(2)得分及理由(满分8分)
得2分。代码实现了哈希表的思想,但存在多个逻辑错误:
- 哈希表数组`hash_min`的大小为MAXINT,这会导致栈溢出或内存分配失败,因为MAXINT过大(2分扣分)。
- 代码未初始化`hash_min`数组,其初始值不确定,可能导致错误(1分扣分)。
- 遍历哈希表时,从i=0开始,但最小正整数应从1开始检查(i=0对应正整数0,但题目要求最小正整数从1开始)(1分扣分)。
- 结果计算错误:当找到第一个`hash_min[i] =...
登录后发布评论
暂无评论,来抢沙发