2018美团面试题-最小的没出现的数字

今天写了美团校招的题,很悲剧,前面太慢了,最后代码时间不够,没想出来怎么做,然后刚结束就想出来了,捂脸!!!

题没记住,大概就是给出一个字符串数组,数组里面的数字是‘0’-‘9’,假如是‘0’,‘1’,‘2’,‘3’,‘4’,这些数可以组成比如1,2,3,4,10,11,12,13,14,20,…………12340,43210这样的数。那么现在找出来最小的没出现的整数,比如1,2。这里第一个没出现的数字就是3,比如0123456789,第一个没出现的数字就是11。

那么现在我们先建立一个数组用来计算每个字符出现的次数,比如000111223456687999。

那么数组里面对应的个数就是{3,3,2,1,1,1,2,1,1,3}我们先找出来第一个最小的数,这里就是下标为3的那个了。下标为4,5,7,8虽然也是1,但是不是第一个。

这里我们分2种情况:

第一:我们得到的最小的数是0下标对应的,那就再分两种情况。

(1)其他数都大于0下标对应的数。比如{2,13,12,11,11,11,12,11,11,13},那就可以直接输出结果了1000(对应为1后面跟比0的下标多1个0)

(1)有一样多的。比如{2,13,2,11,11,11,12,11,11,13},由于最高位只能是非0的,所以只能先取一个2,这时各个元素的大小为:{2,13,1,11,11,11,12,11,11,13}。接下来我们直接再取2,连续取到没有,然后在取一次就是结果了。综合起来就是这时候谁是除0以外最小的,就连续把它都输出来就是了。具体操作就是把0对应的数+1,然后再找最小的。

第二:我们得到的最小的数是除0外其他下标对应的。

直接取这个下标,连续取这个下标对应的数据+1次就是了。

代码如下:

import java.util.*;
import java.util.Scanner;


public class Main {
public static int get(char [] a,char b)
{ int i=0;
for( i=0;i<10;i++)
if(b==a[i])
break;
return i;
}
public static int get(int [] a) {
int min=0;
int temp=a[0];
for (int i = 1; i <10; i++ )  
        if (a[i] < temp)  
        { min =i; 
        temp=a[i];
        }
    return min;  
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
while(input.hasNext())
{
String str=input.nextLine();
String str1="0123456789";
char [] strArr = str.toCharArray();
char [] strArr1 = str1.toCharArray();
int [] sum=new int [10];
int index=0;
for(int i=0;i<strArr.length;i++)
{
  sum[get(strArr1,strArr[i])]++;
}
index=get(sum);
if(index==0)
{
sum[0]++;
index=get(sum);
if(index==0)
{System.out.print(1);
for(int i=0;i<=sum[index];i++)
{
System.out.print(0);
}
}
else 
for(int i=0;i<=sum[index];i++)
{
System.out.print(index);
}
}
else
{
sum[index]--;
index=get(sum);
if(index==0)
{
System.out.print(1);
for(int i=0;i<=sum[index];i++)
{
System.out.print(0);
}
}
else 
for(int i=0;i<=sum[index]+1;i++)
{
System.out.print(index);
}
}
}
}
}

如果哪里还有什么问题我没有想到或者有更好的办法请告知,感激不尽!!!

多谢各位批评指正!!!

猜你喜欢

转载自blog.csdn.net/mad_sword/article/details/79660594