题目:
给定'0'-'9'组成的字符串,各字符出现的次数不定,求由字符串不能组成的最小正整数。
分析:
package 实习面试笔试题;
public class 美团笔试题 {
//求给定字符串0-9,不能组成的最小数
public static void main(String[] args) {
String str="0011122233344455666789";
System.out.println(getMaxNum(str));
}
//求最小不能组成的正整数
private static int getMaxNum(String str){
//获取正整数
int [] alpha=new int[10];
char[] chs = str.toCharArray();
//统计各字符出现的次数
for(char c:chs){
alpha[c-'0']+=1;
}
//统计出现次数最小的
int minIndex=0;
for(int i=1;i<10;i++){
if(alpha[i]<alpha[minIndex]){
minIndex=i;
}
}
if(minIndex==0){
//最小的次数下标为0
if(alpha[minIndex]==0){
//说明最小的次数为0,且出现次数为0
//查找第二小的数
int secondMinIndex=minIndex+1;
for(int i=minIndex+2;i<10;i++){
if(alpha[i]<alpha[secondMinIndex]){
secondMinIndex=i;
}
}
if(alpha[secondMinIndex]==0){
//那么直接返回该缺失的数
return secondMinIndex;
}else{
//说明该数是出现1-9中次数最小的数,直接返回*10,因为0的次数为0
return secondMinIndex*10;
}
}else{
//因为0的次数不为0,那么后面的数字次数均不为0次,至少都比0的次数多
//找到第一个不为0的数,即可
int secondMinIndex=minIndex;
for(int i=minIndex+1;i<10;i++){
if(alpha[i]!=0){
//防止后面还有缺失值
secondMinIndex=i;
//找到第一个不为0的数,直接跳出
break;
}
}
return getNumOf10(secondMinIndex,alpha[minIndex]+1);
}
}else{
//说明次数最小的不是0,那么直接返回该数次数+1
if(alpha[minIndex]==0){
//直接返回该值
return minIndex;
}else{
//不为0,说明最小数次数+1
return getNumOfTimes(minIndex,alpha[minIndex]);
}
}
}
private static int getNumOf10(int num,int times){
//根据0的次数,加上后面最小的数作为最前面的数
for(int i=1;i<=times;i++){
num*=10;
}
return num;
}
private static int getNumOfTimes(int num,int times){
int base=num;
for(int i=1;i<=times;i++){
num=num*10+base;
}
return num;
}
}