算法题:未出现最小正整数

问题描述:给出一个长度为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++;
}

//初始化数组b
MAX=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("未出现最小正整数:%d\n",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.结果测试

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_25740691/article/details/78891387
今日推荐