题目链接

牛客网

题目描述

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

解题思路

可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在前面。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
   
    public String PrintMinNumber(int [] nums) {
   
        if (nums==null || nums.length==0) return "";
        int n = nums.length;
        String[] numsStr = new String[n];
        for (int i=0;i<n;i++) 
            numsStr[i] = nums[i]+"";
        Arrays.sort(numsStr, new Comparator<String>() {
   
            @Override 
            public int compare(String str1, String str2) {
   
                return (str1+str2).compareTo(str2+str1);
            }
        });
        String res = "";
        for (String s: numsStr) 
            res += s;
        return res;
    }
}

lambda表达式

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
   
    public String PrintMinNumber(int [] nums) {
   
        if (nums==null || nums.length==0) return "";
        int n = nums.length;
        String[] numsStr = new String[n];
        for (int i=0;i<n;i++) 
            numsStr[i] = nums[i]+"";
        Arrays.sort(numsStr, (s1, s2)->(s1+s2).compareTo(s2+s1));
        String res = "";
        for (String s: numsStr) 
            res += s;
        return res;
    }
}