现在你手上拥有一些字符,它们都是 ’0’-‘9’ 的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?
数据范围:字符串长度满足 ,字符串中只包含 '0'-'9' 字符。
第一行包含一个字符串,表示你可以使用的字符。
输出你所无法组成的最小正整数
55
1
123456789
10
#include<iostream> #include<algorithm> using namespace std; int num[10]={0,1,2,3,4,5,6,7,8,9}; int a[10]={1};//出现的次数,‘0’的次数初值赋为1,其余为0 bool cmp(int x,int y)//设置比较函数,将10个字符按出现次数从少到多排列 { return a[x]<a[y]; } int main() { string str; cin>>str; for(auto c:str) { a[c-48]++;//记录字符出现次数 } stable_sort(num,num+10,cmp);//次数相同时,值小的排在前面 num[0]==0 ? cout<<1:cout<<num[0]; for(int i=0;i<a[num[0]];cout<<num[0],i++); }
/* 如果字符串缺少1-9中某个数,输出该数 如果1-9都有,找次数最少的数=>如果该数 是0,先输出1,然后输出n+1次0(字符串中出现n次0); 如不是0,直接输出n+1次该数(字符串中出现n次) */ #include<iostream> #include<string> using namespace std; int a[12]={0}; int main(){ string s; cin>>s; for(int i=0;i<s.length();i++){ a[s[i]-'0']++; } bool flag = false; for(int i=1;i<10;i++){ if(a[i]==0){ cout<<i<<endl; flag = true; break; } } if(!flag){ int min = 10000,index=-1; for(int i=0;i<10;i++){ if(min > a[i]){ min=a[i]; index = i; } } if(index==0){ cout<<1; }for(int i=0;i<=a[index];i++){ cout<<index; } } return 0; }
nums = input() num_count = [0,0,0,0,0,0,0,0,0,0] for n in nums: d = (int)(n) if d==0: num_count[9] += 1 else: num_count[d-1] += 1 min_digit = num_count[0] min_di = 0 for i in range(1,10): if num_count[i] < min_digit: min_digit = num_count[i] min_di = i if min_di == 9: print('1'+'0'*(min_digit+1)) else: print(str(min_di+1)*(min_digit+1))
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); char[] num = br.readLine().trim().toCharArray(); int[] counter = new int[10]; for(int i = 0; i < num.length; i++) counter[num[i] - '0']++; int start = 1; while(judge(String.valueOf(start).toCharArray(), counter)) start++; System.out.println(start); } private static boolean judge(char[] num, int[] counter) { int[] cnt = new int[10]; for(int i = 0; i < num.length; i++){ // 如果counter中不包含数字num[i],则num无法表示 if(counter[num[i] - '0'] == 0) return false; cnt[num[i] - '0']++; } // num中的数字都包含,则检查数量是否都够 for(int i = 0; i <= 9; i++){ if(cnt[i] == 0) continue; // 如果组成数字num要求的i数量超出限制,则不能表示 if(cnt[i] > counter[i]) return false; } return true; } }
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 ; } } }
//不统计哈哈哈 import java.util.Arrays; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNext()){ String str=scan.nextLine(); System.out.println(get(str)); } } public static int get(String str){ char[]data=str.toCharArray(); Arrays.sort(data); boolean flag=true; int count=1; while (flag){ String tem=count+""; char[]arr=tem.toCharArray(); Arrays.sort(arr); int i; int j=0; for(i=0;i<arr.length&&j<data.length;){ if(arr[i]!=data[j]) j++; else{ i++; j++; } } if(i!=arr.length){ flag=false; return count; } else count++; } return 0; } }
package numProblem;
#include<iostream> #include<string> #include<cstring> using namespace std; int main(){ string str; while(getline(cin,str)){ int a[10]; for(int i=0;i<10;i++) a[i]=0; char ch[20]; strcpy(ch,str.c_str()); for(int i=0;i<strlen(ch);i++) a[ch[i]-'0']++; int min=1; bool judge=0; for(int i=1,count=0;i<101;i++){ int check[10]={0,0,0,0,0,0,0,0,0,0}; int temp=i; while(temp>0){ check[temp%10]++; temp/=10; } for(int j=0;j<10;j++){ if(a[j]<check[j]){ min=i; judge=1; break; } } if(judge==1) break; } cout<<min<<endl; } }
思路: 通用情况: 如果数符 min 出现次数最少,而且出现次数少于次最少数符 min_sec: 第一步:扫描输入字符串,并对[0,1,2,3,4,5,6,7,8,9] 十种数符(digits)进行计数,得到统计结果:Integer count[] 例子:输入字符串:99988877766655544433322200 count = [3, 3, 3, 3, 3, 3, 3, 3, 0, 2] 第二步:对count进行升序排序,选择出现次数最少的数符和对应出现次数(若没有出现过,记为 0)。 第三步:这个【最少次数:k 次】的【数符:'i'】组成【最终结果】==> iiii...(k+1 次)。 如上例: 数符 '1' 出现 0 次, 最终结果 ==> 1 (0+1次)。 if(...) else { int digit = 0; if(min == 0 && count[min] == count[min_sec]) digit = min_sec; else digit = min; int ans = digit; for(int i = count[digit]; i > 0; i--) ans += digit * (int) Math.pow(10, i); return ans; } 第四步: 特殊情况一:数符 min: '0' 出现次数最少,而且出现次数少于【次最少】数符 min_sec:输入字符串:99988877766655544433322211 按通用情况处理,输出结果为 0,但 0 非正,不满足题意。所以单独处理。 正确结果应该是10 //1个次最少数符 '1', 外加 k+1个最少数符 '0'(k==0, k+1==1) if(min == 0 && count[min] != count[min_sec]) return (int) Math.pow(10, count[min]+1);
特殊情况二:数符 min: '0' 出现次数最少,而且等于【次最少】数符 min_sec:
这种情况和通用情况一样。唯一区别是用要使用 min_sec 来构成最后答案。
/*完整代码*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;
public class Main {
static Integer[] count = new Integer[10];
public Main() {
super();
}
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(find(str));
} catch (IOException e) {
e.printStackTrace();
}
}
public static int find(String str) {
// Integer[] count = new Integer[10];
// 计数初始化为 0
for(int i = 0; i < 10; i++) count[i] = 0;
// 数符集
Integer[] digits = new Integer[10];
for(int i = 0; i < 10; i++) digits[i] = i;
/* count 计数 */
for(char c : str.toCharArray()) count[c - '0'] += 1;
/* 排序*/
Arrays.sort(digits, new myComp());
int min = digits[0];
int min_sec = digits[1];
/* 特例1:数符 '0' 出现次数最少*/
if(min == 0 && count[min] != count[min_sec])
return (int) Math.pow(10, count[min]+1);
/* 通用+特例2:*/
else {
int digit = 0;
if(min == 0 && count[min] == count[min_sec]) digit = min_sec;
else digit = min;
int ans = digit;
for(int i = count[digit]; i > 0; i--)
ans += digit * (int) Math.pow(10, i);
return ans;
}
}
/* class for customized Comparator*/
private static class myComp implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
return count[a] < count[b] ? -1 : count[a] > count[b] ? 1 : a-b;
}
}
}
#include <bits/stdc++.h> using namespace std; int main() { string s; while(cin>>s){ int n = s.length(); int a[11] = {0}; for(int i=0;i<n;i++){ if(s[i]=='0') a[10]++; else a[s[i]-'0']++; } int d = a[1], m=1; for(int i=1;i<=10;i++){ if(a[i]<d){ d = a[i]; m = i; } } if(m==10){ cout<<1; for(int i=1;i<=d+1;i++) cout<<0; }else{ for(int i=1;i<=d+1;i++) cout<<m; } cout<<endl; } return 0; }
#include<stdio.h> #include<string.h> int main(){ char a[1001]; gets(a); int len=strlen(a); int b[10]; memset(b,0,sizeof(b)); //数组b记录有某个元素,b[1]=1表示有1,0则是没有 for(int i=0;i<len;i++) b[a[i]-48]=1; //从1到9遍历,如果b[i]=0那么i最小,否则10最小 for(int i=1;i<10;i++) if(!b[i]){ printf("%d",i); break; } else{ if(i==10){ printf("10"); break; } } return 0; }
#include <iostream> #include <vector> #include <algorithm> #include<math.h> using namespace std; int main(void) { string s; cin >> s; long check[10]={0}; for (int i = 0; i < s.size(); i++) { char temp=s[i]; int num=temp-'0'; check[num]++; } int cntmin=99999; int nummin; for(int i=9;i>0;i--) { if(check[i]<=cntmin) { cntmin=check[i]; nummin=i; } } long long minnot=1; char nummin_char=nummin+'0'; string output=string(cntmin+1,nummin_char); string zeros=string(check[0]+1,'0'); zeros='1'+zeros; if(zeros<'0'+output) cout<<zeros; else cout<<output; return 0; }
数字字符
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()); } }
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; map<int,int>mp; for(int i=0;i<10;++i) mp.insert(make_pair(i,0)); for(char c:s) mp[c-'0']+=1; int ans = INT_MAX; char c; for(auto it=mp.begin();it!=mp.end();++it) { if(it->second<ans){ ans = it->second; c = it->first+'0'; } } if(ans==0){ if(c=='0'){ int flag = 0; for(auto t:mp){ if((t.second==0)&&(t.first!=0)) { cout<<t.first<<endl; return 0; } } cout<<10; } else cout<<c; return 0; } string res = ""; for(int i=0;i<mp[c];++i) res+=c; if(c=='0') res = '1'+res; cout<<res<<endl; return 0; }
#include <stdio.h> int sum[10]; int main() { int i,j; char c; for(c=getchar();c^'\n';c=getchar()) sum[c-'0']++; for(i=0;i<0x7fffffff;i++) { int used[10]={0}; for(j=i;j;j/=10) { used[j%10]++; if(used[j%10]>sum[j%10]) { printf("%d\n",i); return 0; } } } }