把数组排成最小的数

题目:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

解题思路:

1.本题可抽象为一个排序问题,把数组按从小到大排好序,然后遍历,小的放前面,大的放后面,即得所求。
2.问题就在于:这个排序问题中,两个数之间比较的时候,怎么算大,怎么算小。
“456”跟”123”,”456”应该放后面,而”456”>”123”,没问题 ;
而 “3”跟”321”,”3”应该放后面,但”321”>”3”,这个是有问题。
类似的 “12”和”123”,”12321”和”123”,”54345”和”543”等。
4.a+b和b+a是隐形的大数问题,要转换为String。借用String的compareTo()方法比较比较s1=a+”“+b 和s2= b+”“+a的大小。
5.创建比较器按我们定义的规则比较。
6.时间复杂度: O(nlogn)

java实现:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String str = "";
        if(numbers == null || numbers.length <= 0)
            return str;
        ArrayList<Integer> al = new ArrayList<Integer>();
        for(int i = 0; i < numbers.length; i ++){
            al.add(numbers[i]);
        }
        Collections.sort(al, new Comparator<Integer>(){ //创建比较器,按照比较器定义的比较规则排序
            public int compare(Integer first, Integer second){ 
                String s1 = first + "" + second;  //强制转换为String类型
                String s2 = second + "" + first;
                return s1.compareTo(s2);
            }
        });

        for(int i : al){
            str += i;
        }
        return str;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值