1. 程式人生 > >《劍指offer》系列 把陣列排成最小的數(Java)

《劍指offer》系列 把陣列排成最小的數(Java)

連結

牛客:把陣列排成最小的數

題目描述

輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。

思路

1、全排列

求出陣列中所有數字的全排列,然後把每個全排列拼起來,求出拼出來的數字的最大值。

2、定義新的排序規則

如果兩個數字m,n拼接成mn和nm,如果mn<nm,那麼m應該排在n的前面,我們定義此時m小於n,如果mn=nm,我們定義m等於n。

可以考慮將數字轉成字串,一來防止數字拼接時的溢位,二來字串的拼接和比較容易實現。

由於把數字m和n拼接起來得到mn和nm,它們的位數一定是相同的,因此比較它們的大小隻需按照字串大小的比較規則即可。

程式碼

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
		int len = numbers.length;
		String []str = new String[len];
		for(int i=0; i<len; i++){
			str[i] = String.valueOf(numbers[i]);
		}
		StringBuffer sb = new StringBuffer();
		Arrays.sort(str, new Comparator<String>(){

			@Override
			public int compare(String s1, String s2) {
				// TODO Auto-generated method stub
				String c1 = s1+s2;
				String c2 = s2+s1;
				return c1.compareTo(c2);
			}
			
		});
		for(int i=0; i<len; i++){
			sb.append(str[i]);
		}
		return sb.toString();
        
    }
}