-
题目大意:给出N个整数(整数范围在int的范围),找出不存在其中的最小正整数
-
思路:
- 将整数存入vector(找的是最小正整数,所以负数没有存入的意义),然后再用map存一遍,若该数存在,则m[num] = 1,否则m[num] = 0
- int的范围在
-2147483648-+2147483647
,分配不了这么大的数组,所以不能用hash,只能用map
- int的范围在
- 从1开始遍历,判断m[i] 是否为1,为0的第一个数就是不存在于vector的最小正整数
- 将整数存入vector(找的是最小正整数,所以负数没有存入的意义),然后再用map存一遍,若该数存在,则m[num] = 1,否则m[num] = 0
-
知识点:
- vector
- map
- int的取值范围
-
代码:
#include <iostream> #include <vector> #include <map> using namespace std; int main(){ int n, num, i; cin >> n; map<int, int> m; vector<int> v; for(i = 0; i < n; i++){ cin >> num; if(num > 0) // 没有比负数小的正整数,所以不用将负数存入数组 v.push_back(num); } for(i = 0; i < v.size(); i++) m[v[i]] = 1; i = 1; // 忘了 while(m[i] != 0) // 判断条件写成了==0,并且是h[v[i]] i++; cout << i; return 0; }
总结:
-
看到这道题的一瞬间,我觉得好简单啊,肯定10分钟就能写完,结果栽到坑里了::整数的取值范围为int的取值范围,即
-2147483648-+2147483647
,所以是不能用普通的hash去存的,因为没有那么大的数组。用map存就能解决问题。 所以说:做题不要理所当然!!!要认真审题!!!
-
数组不能设得太大了,不然会报栈错误。
-
今天做题脑子抽了,犯了两个很愚蠢的问题:
- 我将
i
定义在for循环
外了,再用的时候忘记初始化了,所以一直报栈溢出的错; while()
里的判断条件写错了,应该和if()
一样的,符合条件才执行循环语句里的东西;
- 我将
-
map[key]
查询无果,就会返回0。