心存疑惑的小兰——求没出现过的最小正整数



题目:

885580-20161005095500942-1172374466.png



分析:

思路一:

这道题要求没有出现过的最小正整数,最直接的暴力法就是用一个变量i从1开始自加,对每一个i都遍历一遍数组,如果有发现和i相等的,i++,再遍历一遍,如果没有,就输出i。


思路二:

由于给出的数都是正整数,可以用来做数组下标,如果有一个bool数组,初值为false,每输入一个正整数num,就把以num-1为下标的值改为true,说明该正整数已经出现过。那么最后只要遍历一遍数组,第一个值为false的下标i再加上1就是所要找的最小正整数。由于题目给出的N最大为1000,也就是说最多会有1000个数,如果给出的数num都在1<=num<=1000,那么输出的结果一定是在1~1001,当输入为1~1000这1000个数时,输出结果为1001,是最极端的情况;如果给出的数中出现了一个num>1000,那么最后的结果一定是在1~1000,也就是说不管怎样,在N<=1000的情况下,输出结果不会超过1001,所以bool数组开1001就够了并且大于1000的数可以不考虑。

代码:

思路一:

#include<iostream>
using namespace std;

int main()
{
    int n,i,r,a[1000],k;

    cin>>n;

    for(i=0;i<n;i++)
        cin>>a[i];
    
    for(r=1;;r++)
    {
        k=0;                      //用k来标记是否有出现该正整数
    
        for(i=0;i<n;i++)
        {
            if(r==a[i])
            {
                k=1;
                break;
            }       
        }
    
        if(k==0)                 //如果k==0,说明这个数没有出现,这时的r就是结果
            break;
    }

    cout<<r<<endl;

    return 0;
 } 

思路二:

#include<iostream>
using namespace std;

int main()
{
    int n,i,num;
    bool a[1001]={false};               //bool数组开1001就够,且初值都为false

    cin>>n;

    for(i=0;i<n;i++)
    {
        cin>>num;
        if(num<1001&&!a[num-1])      //大于1000的数可以不考虑,并且可能会有重复的数,所以判断条件加上a[num-1]!=false
            a[num-1]=true;
    }

    for(i=0;i<n;i++)
    {
        if(!a[i])                  //满足条件说明已经找到了,可以结束并输出了
            break;
    }

    cout<<i+1<<endl;

    return 0;
 } 


转载于:https://www.cnblogs.com/jiuweilinghu/p/5931776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值