题目:
分析:
思路一:
这道题要求没有出现过的最小正整数,最直接的暴力法就是用一个变量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;
}