Java——把数组排成最小的数

该问题要求将非负整数数组拼接成最小的数字字符串。通过创建一个Comparator来比较数字的不同排列,对数组排序,然后连接排序后的数字,形成最小的数字。解决方案使用了ArrayList、Collections.sort和StringBuffer等Java集合和字符串工具。

题目链接

牛客网在线oj题——把数组排成最小的数

题目描述

输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

数据范围:
0<=len(numbers)<=100

题目示例

示例1

输入:
[11,3]

返回值:
“113”

示例2

输入:
[]

返回值:
“”

示例3

输入:
[3,32,321]

返回值:
“321323”

解题思路

这道题实际的意思是:将所有数组中的元素拼接成一个字符串,当这个字符串对应的数字比其他情况都小时,对应的拼接顺序是什么

首先数组中所有的元素都添加到整形类型的顺序表中,这样可以用Collections中的sort方法进行排序

Collections.sort需要传入顺序表list和比较方法,创建一个Comparator比较器,重写其中的compare方法
在这里插入图片描述

其中o1元素为第一个元素,o2元素为第二个元素,分别将o1o2排序形成的数字和o2o1排序形成的数字进行比较,返回其中较小值

最后再创建一个stringBuffer对象,将排序好的顺序表一一添加进stringBuffer对象中即可得到最终的字符串

完整代码

import java.util.*;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        if(numbers == null || numbers.length == 0){
            return "";
        }
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < numbers.length; i++){
            list.add(numbers[i]);
        }
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer x, Integer y) {
                String xs = x + "" + y;
                String ys = y + "" + x;
                return xs.compareTo(ys);
            }
        });
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < numbers.length; i++){
            stringBuffer.append(list.get(i));
        }
        return stringBuffer.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值