【劍指Offer】32、把數組排成最小的數


  題目描述:

  輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM