现在你手上拥有一些字符,它们都是 ’0’-‘9’ 的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?
数据范围:字符串长度满足 ,字符串中只包含 '0'-'9' 字符。
第一行包含一个字符串,表示你可以使用的字符。
输出你所无法组成的最小正整数
55
1
123456789
10
数字字符
1,2,3,4,5,6,7,8,9, 10
11, 12,13,..., 20
...
100, 101, 102,...
我们先统计0-9每个数字可以使用的数量。
我们可以很容易发现,如果是1-9之间数字某一个数字没有可以使用的,显然无法组成最小正整数就是该数字,如果是0没有,则无法组成的就是10。
(1)如果某位数字比较少,其他数字数量大于该为数字数量至少一个,必然最少的数字最先短缺,而其他数字相对充足。
如果1只有x个,其他数字充足, 则最小正整数一定是111..11(共x+1)位数字,因为该数字最先使用x+1个1,因此,出现不足。
类似的,有2,3,9 都是如此。
如果0只有x个,其他数字充足,那么最先消耗到,x+1个0的最小正整数就是1000..0(共x+1个0)。
(2)还有一种情况,如果有多位数字都一样最少,则一定会出现数字越小的越出现短缺(此时的0应该看做10,排在最后;如果题目要求的是最小自然数,此时0将最先短缺)。
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); char[] c = sc.next().toCharArray(); int[][] cnt = new int[10][2]; for(int i=0;i < 10; i++) cnt[i][1] = i; cnt[0][1] = 10; for(int i=0; i < c.length; i++) cnt[c[i]-'0'][0] ++; Arrays.sort(cnt, (o1, o2)-> o1[0] == o2[0]? o1[1] - o2[1] : o1[0] - o2[0]); StringBuilder sb = new StringBuilder(); if(cnt[0][1] == 10) { sb.append(1); for(int i=0; i <= cnt[0][0]; i++) sb.append(0); } else { for(int i=0; i <= cnt[0][0]; i++) sb.append(cnt[0][1]); } System.out.println(sb.toString()); } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.List; public class Main{ public static void main(String args[]) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); char c[] = br.readLine().toCharArray(); int arr[] = new int[c.length]; List list = Arrays.asList(arr); for(int i = 1;i < 10;i++){ if(!list.contains(i)){ System.out.println(i); return ; } } if(!list.contains(0)){ System.out.println(arr[0] + 0); return ; } } }
package numProblem;
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); char[] numberCount=new char[10];//存放0到9的数量 char[] input=sc.next().toCharArray(); //分析输入 for(int i=0;i<input.length;i++) { numberCount[input[i]-'0']++; } //查找出现数量最少的数字 和 其出现的次数 int minComeNumber=0; //初始化出现数量最少的数字为零 int minComeCount=numberCount[0];//初始化为0出现的次数 boolean flag=true;//是否除零之外所有数字都出现过 int uncomeNumber=-1;//未出现过的数字 //循环查找出现次数更少的数字 相同数量保留较小的数字 for(int i=1;i<10;i++) { if(numberCount[i]==0)//判断此数字是否出现 { //数字未出现 记录此数字 标记置为false 并退出查找 flag=false; uncomeNumber=i; break; } if(numberCount[i]<minComeCount) { minComeNumber=i; minComeCount=numberCount[i]; } } //查找完成 如果具有最小出现次数的数字为0 //则不能组成的最小数字为1 0出现次数+1个零 int unarrivableNumber=0; if(flag) { if(minComeNumber==0) { unarrivableNumber=(int) (1*Math.pow(10, minComeCount+1)); } else//具有最小出现次数的数字不为零 { //不能组成的最小数字为该数字出现次数加一次重复 for(int i=0;i<=minComeCount;i++) { unarrivableNumber+=minComeNumber*(int)(Math.pow(10,i)); } } } else { unarrivableNumber=uncomeNumber; } //输出 System.out.println(unarrivableNumber); } }