题目描述:在十进制表示中,任意一个正整数都可以用字符‘0’-‘9’表示出来。但是当‘0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’ ,一个‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。现在你手上拥有一些字符,它们都是‘0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?
输入:第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符(1 ≤字符串长度≤ 1000)。
输出:输出你所无法组成的最小正整数。
样例输入:55
样例输出:1
解题思路:本题的目的是如何从一堆字符中找到不能由它组成的最小的正整数,所以我们需要研究字符串来找到这个规律。这个规律算不上复杂,通过写出一些特定的样例字符串进行观察,很容易便可以得到正确的规律。
如:
输入:011223344556778899
输出:66
输入:0112233445566778899
输出:100
输入:02233445566778899
输出:1
输入:012233445566778899
输出:11
总结出规律之后,我们就可以使用以下步骤进行寻找输出:
(1)对输入的字符串, 从0到9,计算其中的每一个数字字符的出现次数;
(2)寻找目标数字:
从0到9,寻找出现次数最少的数字字符。当目标数字为0,遇到出现次数与0的出现次数相同或者少于0的出现次数的数字字符,那么目标数字变为这个数字;当目标数字不为0,只当遇到出现次数比目标数字出现次数少的数字字符时,才将目标数字改变为这个数字。
更直观地讲,用target代表目标数字,index代表从1到9变化的位置,count是保存了0-9数字字符出现次数的数组,那么当target=0时,如果count[index]<=count[target],则target=index;target>0时,只有count[index]<count[target]时,才有target=index。
(3)使用目标数字构建最小数字:
当目标数字为”0“时,最小数字是由一个“1”开头后面跟上0的出现次数加1个“0”组成的数字,比如针对上例中出现的输入“0112233445566778899”,目标数字是0,0出现1次,输出结果是”1“加上2个”0“,即100。
当目标数字不为0时,最小数字即由目标数字加1个目标数字组成,比如”011223344556778899“,目标数字为6,6出现1次,最小数字即由2个”6“组成,即66。
具体实现代码如下:
import java.util.Scanner;
/**
*
* @author 李硕
*/
public class Main{
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
int []a=new int[10];
if(s.length()<1||s.length()>1000){
return;
}
for(int i=0;i<s.length();i++){
a[Integer.parseInt(s.charAt(i)+"")]+=1;
}
int min=0;
for(int i=1;i<10;i++){
if(a[i]<a[min]||(min==0&&a[i]<=a[min])){
min=i;
}
}
if(min==0){
System.out.print(1);
if(a[1]>=1)
for(int i=0;i<a[0]+1;i++){
System.out.print(0);
}
}
else{
for(int i=0;i<a[min]+1;i++){
System.out.print(min);
}
}
}
}
最后,将代码放到在线编译器中,AC啦。
声明:由于在线编程时间仓促,算法和代码中难免存在疏漏之处,如有读者发现错误之处,万望提醒修改。