/*
* 任意一个正整数可以用字符’0‘-’9‘表示出来。但是当这些字符每种字符数量有限时,可能有些正整数表示不出来。比如有两个’1‘,一个’2‘,
* 能表示出11,12,112等等,但是无法表示出10,122,200等数。现在有一些字符,他们都是0-9的字符,可以从中选出一些字符组成一个数字,
* 那么你所无法组成的最小正整数是多少。
* 任意一个正整数可以用字符’0‘-’9‘表示出来。但是当这些字符每种字符数量有限时,可能有些正整数表示不出来。比如有两个’1‘,一个’2‘,
* 能表示出11,12,112等等,但是无法表示出10,122,200等数。现在有一些字符,他们都是0-9的字符,可以从中选出一些字符组成一个数字,
* 那么你所无法组成的最小正整数是多少。
* */
思路: 将'0'-'9'字符出现的次数最少的字符找出来。比如输入‘11233445566677889900’出现次数最少的字符是‘2’,那么不能组成的最小正整数为22;另外‘0’字符出现的次数要单独比较。
代码如下:
public class Demo {
public static void main(String[] args) {
String string = "1122334455667788990";
System.out.println(GetMinInt(string));
}
public static int GetMinInt(String str) {
char[] ch = str.toCharArray();
int[] char_array_string = new int[256]; //存字符串中出现的字符和出现次数
for (int i=0; i<ch.length; i++) {
char_array_string[ch[i]]++;
}
int tmp = 1;
for (int i=1; i<=9; i++) {
if (char_array_string[(char)(i+48)] == 0) {
return i; //如果’0‘-’9‘某个字符个数为0,直接返回。
}
if (char_array_string[(char)(i+48)] < char_array_string[(char)(tmp+48)]) {
tmp = i; //找到出现次数最少的字符
}
}
if (char_array_string['0'] == 0) {
return 10; //'0'出现的次数单独比较,如果次数为0,直接返回10
} else if (char_array_string[(char)(tmp+48)] <= char_array_string['0']) { //0-9出现次数少于0
int num = 0;
for (int i=0; i<=char_array_string[(char)(tmp+48)]; i++) {
num = num*10 + tmp;
}
return num;
} else {
return (int) Math.pow(10, char_array_string['0']+1); //0出现次数大于1,且最少的情况。直接返回10的幂次方
}
}
}