首页 > 编程知识 正文

没有最大的正整数但有最小的正整数,没有出现的最小正整数

时间:2023-05-03 23:16:39 阅读:184460 作者:382

问题描述:给出一个长度为n的整数数组,通过函数得出数组中未出现的最小正整数。
格式:输入一行数组元素,输出一个未出现最小正整数。
输入样例

[-5,2,4,3]

输出样例

1

输入样例

[1,2,3,3]

输出样例

4 1.注意事项

1.从输入和输出样例可以发现规律,需要查找数组中正整数k从1开始递增,到数组中最大元素max+1的范围内,未出现最小的正整数。
2.从上面规律来看,采用穷举算法思想会比较简单,但整数范围较小时适用。
3.输入的数组中含有负数,因此需要对数组进行从小到大排序,并确定大于0的元素下标,从此下标开始进行操作。
4.由于数组a中含有重复元素,采用a数组中查找b数组中元素是否存在会可简化比较过程中的指针操作。
5.数组b是从1到max+1递增的正整数数组,从b取一个元素b[i],在整数a中查找是否存在,如果存在则将b[i]置零。若不存在即进行下一个比较。
最后输出数组b中第一个非零元素。

2.设计思想

首先对数组a进行从小到大的排序,确定大于0的数组a开始元素下标i,数组a中最大的元素max,那么数组b的范围是1~max+1,然后从数组a中查找b[i]是否存在,若b[i]存在,则b[i]置零,否则进行下一个b[i]的查找,最后对b数组进行遍历,查找第一个非零的元素即为未出现最小元素。
未出现最小正整数代码

void minPositiveInteger(){int n=4;//数组大小int a[n];//初始化数组//数组输入赋值printf("请输入数组:");int i,j,k,temp,MAX,MIN;for(i=0;i<n;i++){ if(i==0) scanf("[%d,",&a[i]); else if(i==n-1) scanf("%d]",&a[i]); else scanf("%d,",&a[i]);}//对数组排序for(i=0;i<n-1;i++){ temp=a[i+1]; j=i; while(j>-1&&temp<a[j]){ a[j+1]=a[j]; j--; } a[j+1]=temp;}printf("排序后数组:"); show(a,n);i=0;while(a[i]<=0){//获取数组a非零元素起始坐标i++;}//初始化数组bMAX=a[n-1]+1;//确定b数组大小范围int b[MAX];//b数组赋值for(j=1;j<MAX+1;j++){ b[j-1]=j;}if(a[i]<1)//若a中最小正整数小于1,min即为1 MIN=1;else{//开始比较b数组中元素是否在a数组中存在和置零操作for(j=0;j<MAX;j++){ temp=0; for(k=i;k<n;k++){ if(b[j]==a[k]){ b[j]=0; continue; } }}//获取未出现最小正整数for(j=0;j<MAX;j++){ if(b[j]>0){ MIN=b[j]; break; }}}printf("未出现最小正整数:%dn",MIN);}void show(int a[],int n){//输出结果int i; for(i=0;i<n;i++){ if(i==0) printf("[%d,",a[i]); else if(i==n-1) printf("%d]",a[i]); else printf("%d,",a[i]);}printf("n");} 3.结果测试


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。