• 数组第一个没出现的非负整数


    给定一个整数数组,里面可能有正数,负数,和0。求最小的没在其中出现的非负整数。

    输入: 整数数组。
    输出: 最小的没出现的非负整数。

    例如:  输入:{2,1,3} 输出0
                输入:{5,2,0,1.4,1,2} 输出3
                输入:{5,2,3,0,4,1} 输出6

    #include<stdio.h>
    
    void swap(int* a,int i, int j);
    int firstOutInt(int a[],int n);
    
    main()
    {
            char end;
            int i, n,max,a[100],result;
            int len=0;
            i=0;
            while(1){
                    scanf("%d",&a[i]);
                    scanf("%c",&end);
                    if(end=='\n')
                            break;
                    i++;
            }
            len=++i;// 之前写成了len=i++;fuck!找半天
            result=firstOutInt(a,len);
            printf("%d\n",result);
    }
    
    int firstOutInt(int a[],int n)
    {
            int i;
            for(i=0; i<n; i++){
                    while(a[i]>=0 && a[i]<n && a[i]!=a[a[i]]){
                            swap(a,i,a[i]);//使a[i]=i
                    }
            }
            int j;
            for(j=0;j<n;j++){
                printf("%d ",a[j]);
            }
            printf("\n");
            for(i=0; a[i]==i && i<n; i++);
            return i;
    }
    
    void swap(int* a,int i,int j)
    {
            int tmp;
            tmp=a[i];
            a[i]=a[j];
            a[j]=tmp;
    }

    思路:求得是没有出现的最小非负整数(包含零),构造数组使得a[i]==i,所以第一个a[i]!=i的i就是没有出现的最小非负整数。

    a[i]>=0 ........a[i]==i <n .......在前两个条件满足下,a[i]如不等于i,即a[i]!=a[a[i]],这时候a[i]的值应该在数组a[a[i]]中,所以交换一下。

    若求得是没有出现的最小正整,则构造a[i]==i,i从1开始,对a[0]的大小分类讨论。若是从1-n的过程中发现a[i]!=i就成功,若未发现a[i]!=i,则看a[0]是不是等于n,n是数组长度,等于i=n+1,不等于i=n。

  • 相关阅读:
    判断闰年
    CaesarCode
    substring
    configure: error: Cannot use an external APR with the bundled APR-util
    字符串处理487-3279
    git分支管理
    git解决冲突
    git 分支的创建和切换
    nginx与php-fpm原理
    git 远程仓库与本地项目关联
  • 原文地址:https://www.cnblogs.com/byking/p/2965257.html
Copyright © 2020-2023  润新知