【PAT】1144 The Missing Number (20 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:给出N个整数(整数范围在int的范围),找出不存在其中的最小正整数

  • 思路:

    1. 将整数存入vector(找的是最小正整数,所以负数没有存入的意义),然后再用map存一遍,若该数存在,则m[num] = 1,否则m[num] = 0
      • int的范围在-2147483648-+2147483647,分配不了这么大的数组,所以不能用hash,只能用map
    2. 从1开始遍历,判断m[i] 是否为1,为0的第一个数就是不存在于vector的最小正整数
  • 知识点:

    1. vector
    2. map
    3. 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;
    }
    

总结:

  1. 看到这道题的一瞬间,我觉得好简单啊,肯定10分钟就能写完,结果栽到坑里了::整数的取值范围为int的取值范围,即-2147483648-+2147483647,所以是不能用普通的hash去存的,因为没有那么大的数组。用map存就能解决问题。

    ​ 所以说:做题不要理所当然!!!要认真审题!!!

  2. 数组不能设得太大了,不然会报栈错误

  3. 今天做题脑子抽了,犯了两个很愚蠢的问题:

    1. 我将i定义在for循环外了,再用的时候忘记初始化了,所以一直报栈溢出的错;
    2. while()里的判断条件写错了,应该if()一样的,符合条件才执行循环语句里的东西
  4. map[key]查询无果,就会返回0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值