【劍指offer較難部分14】把陣列排成最小的數(java)
阿新 • • 發佈:2021-01-12
題目描述
輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。
分析
該題要求我們求出陣列排列組合後的最小數字,那麼該題就是排列組合問題,可以用之前寫過的題的模板套一下,步驟基本相同,小改即可。沒接觸過全排列的可以先看下面的題。
步驟:
第一步:求出所有的組合方式,將其放在一個list中
第二步:排序,第一個即為最小,返回它即可
實現程式碼:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0){
return "";
}
//第一步,可以求出所有的組合方式,將其放在一個list中---全排列問題
ArrayList<String> list = new ArrayList< >();
//全部排列組合
AllPermutation(numbers, list, 0);
//第二步,排序,第一個即為最小值,返回即可
Collections.sort(list);
return list.get(0);
}
public void AllPermutation(int[] numbers, ArrayList<String> list, int pos){
//若走到最後,則表示當前執行完畢,新增進list
if (pos == numbers.length - 1){
StringBuilder sb = new StringBuilder();
for(int num : numbers){
sb.append(num);
}
if(!list.contains(sb.toString())){
list.add(sb.toString());
}
return;
}
for(int i = pos ; i < numbers.length ; i++){
swap(numbers, i, pos);
AllPermutation(numbers, list, pos+1);
swap(numbers, i, pos);
}
}
public void swap(int[] numbers, int i, int j) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}