题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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;
}
}