1. 程式人生 > >劍指Offer:面試題33——把陣列排成最小的數(java實現)(未完待續)

劍指Offer:面試題33——把陣列排成最小的數(java實現)(未完待續)

問題描述:

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

思路1:

最直接的做法就是先求出這個陣列中的所有數字的全排列,然後把每個排列拼起來,最後求出i拼起來的數字的最小值。

思路2:

1.找到一種排序規則,陣列根據這個排序規則能拍成一個最小的數字比如m與n, mn排起來小於nm排列,則定義mn小於nm
2.其次,要考慮的是如何拼接數字,即給出數字m與n,怎麼得到數字mn和nm並比較他們的大小。(直接用數字去計算不難辦到,但是要考慮到表達型別與溢位問題)。所以我們直觀的選擇字串來表達數字。同時mn與nm的位數肯定是相同的,因此比較它們的大小隻需要按照字串大小的比較規則就可以了。

程式碼:(哎,沒寫出來。)

下面別人的程式碼(先貼出來研究研究)

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class Solution {
    String minValue = null;
    public String PrintMinNumber(int [] numbers) {
        if(numbers == null || numbers.length == 0)return "";
        List<Integer> datas = new
ArrayList<Integer>(); for(int i=0;i<numbers.length;i++) { datas.add(numbers[i]); minValue = minValue+numbers[i]; } sort(datas, new ArrayList<Integer>(), numbers.length); return String.valueOf(minValue); } public void
sort(List<Integer> datas, List<Integer> target, int length) { if(target.size() == length) { StringBuilder sb = new StringBuilder(); for(int i=0;i<target.size();i++) { sb.append(target.get(i)); } if(sb.toString().compareTo(minValue)<0) { minValue = sb.toString(); } } for(int i=0;i<datas.size();i++) { List<Integer> newDatas = new ArrayList<Integer>(datas); List<Integer> newTarget = new ArrayList<Integer>(target); newTarget.add(newDatas.get(i)); newDatas.remove(i); sort(newDatas, newTarget, length); } } }