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



题目:



分析:

思路一:

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


思路二:

由于给出的数都是正整数,可以用来做数组下标,如果有一个bool数组,初值为false,每输入一个正整数num,就把以num-1为下标的值改为true,说明该正整数已经出现过。那么最后只要遍历一遍数组,第一个值为false的下标i再加上1就是所要找的最小正整数。由于题目给出的N最大为1000,也就是说最多会有1000个数,如果给出的数num都在1<=num<=1000,那么输出的结果一定是在11001,当输入为11000这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;
 } 


posted @ 2016-10-07 12:06  JackinHu  阅读(333)  评论(0编辑  收藏  举报