现在你手上拥有一些字符,它们都是 ’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++);
}
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;
}
/*
如果字符串缺少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;
}
#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;
}
}
}
}