1. 程式人生 > 其它 >【劍指offer較難部分14】把陣列排成最小的數(java)

【劍指offer較難部分14】把陣列排成最小的數(java)

技術標籤:劍指offer(java)演算法java資料結構

題目描述

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

在這裡插入圖片描述