求使用一些数字字符无法组成的最小正整数

题目描述在十进制表示中,任意一个正整数都可以用字符‘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啦。



声明:由于在线编程时间仓促,算法和代码中难免存在疏漏之处,如有读者发现错误之处,万望提醒修改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值