组合出合法最小数

题目描述

给一个数组,数组里面哦都是代表非负整数和大小写字母的字符串,如果含字母,先替换成assic码值,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字

输入描述

一个数组,数组不为空,数组里面都是代表非负整数和字母的字符串,可以是0开头,例如:["1a3", "045b", "09a", "56"]
数组的大小范围:[1, 50]
数组中每个元素的长度范围:[1, 30]

输出描述

以字符串的格式输出一个数字,

  • 如果最终结果是多位数字,要优先选择输出不是“0”开头的最小数字
  • 如果拼接出来的数字都是“0”开头,则选取值最小的,并且把开头部分的“0”都去掉再输出
  • 如果是单位数“0”,可以直接输出“0”

用例一

        输入:20 1a

        输出:19720

用例二

        输入:08 A10 2

        输出:82650

用例三

        输入:01B 02

        输出: 16602

解题思路:输入描述字符串长度1-30,这就决定了我们没法通过数学运算来解决这个问题,这样做必然会遇到数据溢出。仅有的方案就是通过排序,拼接字符串解决,值最小的放最左边。

解题步骤:

1、数据转换:把字母替换成数字

2、数组排序:排序直接排肯定有问题,比如010、02 ,自然排序肯定是010小,但是拼接起来1002显然大于201,不符和我们的要求,所以把两个要比较的字符串连接起来比较才是最稳妥的。

3、拼接字符串:从左到又依次连接字符串

4、检查并剪除字符串的前导0,并输出。

最终的代码用JAVA实现如下

import java.util.*;
import java.util.Arrays;

public class NumberConnect{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] arr = scanner.nextLine().split(" ");
        scanner.close();
        
        String res= Arrays.stream(arr)
            .map(NumberConnect::convertStringToAscii)   // 字母转数字
            .sorted((a, b) -> (a + b).compareTo(b + a))  // 排序
            .reduce("",(a,b)->a+b);                     // 连接

       res=res.replaceFirst("^0+", "");                 // 删除前导0
       System.out.println(res);
    }

    private static String convertStringToAscii(String original) {
        StringBuilder sb = new StringBuilder();
        if(original==null || original.isEmpty()){
            return original;
        }
        for(int i=0;i<original.length();i++){
            Character ch=original.charAt(i);
            if(Character.isLetter(ch)){
                sb.append((int) ch);
            }else{
                sb.append(ch);
            }
        }
        return sb.toString();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值