首页 > 试题广场 >

数字字符

[编程题]数字字符
  • 热度指数:3366 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
在十进制表示中,任意一个正整数都可以用字符 ’0’-‘9’ 表示出来。但是当 ’0’-‘9’ 这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个 ‘1’ ,一个 ‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。
现在你手上拥有一些字符,它们都是 ’0’-‘9’ 的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?

数据范围:字符串长度满足 ,字符串中只包含 '0'-'9' 字符。

输入描述:
第一行包含一个字符串,表示你可以使用的字符。


输出描述:
输出你所无法组成的最小正整数
示例1

输入

55

输出

1
示例2

输入

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());
    }
}
发表于 2020-06-24 18:15:12 回复(0)
这题目的测试用例好像有点问题,我按照我想法做了一半想看看能过多少用例结果全过了??
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 ;
        }
        
    }
}
这肯定是不对的,但是既然提示过了就看了大佬的思路也算做过了吧嘿嘿嘿..
编辑于 2019-07-23 15:22:03 回复(2)
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] s = sc.nextLine().split("");
        int[] arr = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            arr[i] = Integer.parseInt(s[i]);
        }
        Arrays.sort(arr);
        int min = arr[0];
        while (min == 0){
            int i = 1;
            min = arr[i];
            i++;
        }
        if (min == 1){
            System.out.println(10);
        }else if (min > 1 ){
            System.out.println(1);
        }
    }
}
发表于 2019-06-27 16:05:28 回复(0)
 package numProblem;

import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int number = 0;
        int count;
        int mixcount = 0;
        String result = "";
        Scanner sc=new Scanner(System.in);
        String src=sc.next();
        //统计每一个数字(0~9)的个数,并找到最少的数字及个数
        for (int i = 0; i < 10; i++) {
            count = src.length() - src.replace(Integer.toString(i), "").length();
            //0的话需要+1,因为同样位数时0需要的少一个。
            if (i == 0) {
                count ++;
            }
            //如果是第一个数0,或者数量更少则更新最少的数字和最少个数。
            if (i == 0 || count<mixcount) {
                number = i;
                mixcount = count;
            }
        }
        //输出结果
        //如果是0,则首位为1
        if(number==0){
            result = "1";
            mixcount--;
        }
        for (int i = 0; i <= mixcount; i++) {
            result = result + Integer.toString(number);
        }
        System.out.println(result);
    }
}

发表于 2019-04-10 19:45:27 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String src=sc.next();
        String[] arr=src.split("");
        int min=Integer.valueOf(arr[0]);
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                int num=Integer.valueOf(arr[i]+arr[j]);
                if(num<min)
                    min=num;
            }
        }
        if(min>1)
            System.out.println(1);
        else
            System.out.println(min-1);
    }
}
编辑于 2019-03-12 14:53:55 回复(0)
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);
}
}

发表于 2019-01-26 23:14:02 回复(0)

问题信息

上传者:小小
难度:
9条回答 8476浏览

热门推荐

通过挑战的用户

查看代码
数字字符