把数组排成最小的数

58 阅读1分钟

题目

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]
输出: "102"

题解:

此题可以理解为排序的变体,只不过排序的规则需要变一下。

设数组 nums 中任意两数字的字符串为 x 和 y ,则规定排序判断规则为:

拼接字符串 x+y > y+x ,则 x 大于 y ;

反之,若 x+y < y+x ,则 x 小于 y ;

例子:"3" "30"

330 > 303 则 3>30;

代码:

快排

class Solution {
    public String minNumber(int[] nums) {
        int n = nums.length;
        String[] strs = new String[n];
        for(int i=0;i<n;i++){
            strs[i] = String.valueOf(nums[i]);
        }
        quickSort(strs,0,n-1);
        StringBuilder res = new StringBuilder();
        for(String s : strs)
            res.append(s);
        return res.toString();
    }
    public void(String[] strs,int l,int r){
        if(l>=r) return;
        int i=l,j=r;
        String temp = strs[l];
        while(i<j){
            while(i<j  && (strs[j]+temp).compareTo(temp+strs[j])>=0) j--;
            if(i<j){
                strs[i] = strs[j];
                i++;
            }
            while(i<j && (strs[i]+temp).compareTo(temp+strs[i])< 0) i++;
            if(i<j){
                strs[j] = strs[i];
                j--;
            }
        }
        strs[i] = temp;
        quickSort(strs,l,i-1);
        quickSort(strs,i+1,r);
    }
}