题目描述
给一个数组,数组里面哦都是代表非负整数和大小写字母的字符串,如果含字母,先替换成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();
}
}