考试时没有做出来,当时只想到了先统计每个字符出现的次数,然后存放在hash数组(一个长度为10的int型数组,出现字符1 则数组索引第1位的元素值加一)里。但是不知道如何去表示“最小不能表示的正整数”。考试之后,我又想了想,试了几个测试用例,找出“等价类”,由具体再抽象出一般的算法。
如果1-9在字符串中有没出现的,那么最小的没出现的就是所求的“最小不能表示的正整数”
如果1-9在字符串中都出现了,那么找出出现次数最少的字符,再分情况,0是否存在字符串中,令出现次数最少的字符的次数为minCount, 该字符为minCountIndex , 如果0在字符串中,那么最小值为(minCount+1)个minCountIndex由左至右的排列输出;如果0不在字符串中,那么最小值为(minCount)个minCountIndex由左至右的排列输出,然后在后面输出一个0
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int len = str.length();
int[] hash = new int[10];
for (int i = 0; i < len; i++) {
hash[str.charAt(i) - '0']++;
}
// 如果有没出现的数字, 直接返回
for (int i = 1; i <= 9; i++) {
if (hash[i] == 0) {
System.out.println(i);
return;
}
}
int minCount = hash[1];
int minCountIndex = 1;
for (int i = 2; i <= 9; i++) {
if (hash[i] < minCount) {
minCount = hash[i];
minCountIndex = i;
}
}
for (int i = 0; i < minCount; i++) {
System.out.print(minCountIndex);
}
if (hash[0] == 0) {
System.out.println(0);
return;
}
System.out.print(minCountIndex);
System.out.println();
}
}