題目描述:
輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字為321323。
解題思路:
本題最直觀的解法就是求出數組中所有數字的全排列,然后比較所有的排列,最后找到最小的排列,但是時間復雜度為O(n!),所以不是一個好的解法。
換一種思路可以發現,本題實際上希望我們找到一個排序規則,數組根據這個排序規則進行重排之后可以連成一個最小的數字。要確定這樣的排序規則,也就是對於兩個數字m和n,通過一個規則確定哪個應排在前面。
根據題目要求,我們可以發現,兩個數字m和n能拼接成mn和nm,如果mn<nm,那m應該在前;如果nm<mn,那么n應該在前。因此,我們得到的排序規則如下:
- 若mn>nm,則m大於n
- 若mn<nm,則m小於n
- 若mn=nm,則m等於n
根據上述規則,我們需要先把數字轉換成字符串再進行比較,因為需要拼接起來。比較完之后按順序連接成一個字符串即可。
編程實現(Java):
import java.util.*;
public class Solution {
class compareStr implements Comparator<String>{
@Override
public int compare(String m,String n) {
String mn=m+n,nm=n+m;
return mn.compareTo(nm); //mn小於nm返回-1,等於返回0,大於返回1
}
}
public String PrintMinNumber(int [] numbers) {
String result="";
if(numbers==null||numbers.length<=0)
return result;
int len=numbers.length;
String[] str=new String[len];
for(int i=0;i<len;i++)
str[i]=String.valueOf(numbers[i]);
compareStr c=new compareStr();
Arrays.sort(str,c);
for(String s:str)
result += s;
return result;
}
}
