【小白也能懂】把数组排成最小的数 只需29ms 还能复习permutation的知识?
把数组排成最小的数
http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
这题我们可以发现,他又一次和permutation的题型有点类似,就是给定一个数组,我们找出他所有可能的排列组合,但是因为这题需要我们找出这些排列组合里最小的数字,所以我们需要额外加上一步来找出我们获得的所有排列组合里最小的数字。
所以这题分两步:
- permutation找出所有的排列组合 (permutation的详细解法我在另一篇博文里有写:https://blog.nowcoder.net/n/953496776beb4e4d9a9f80112910ae58)
- 运用Collections.sort()来帮助我们找出最小值
具体代码如下:
import java.util.ArrayList; import java.util.*; public class Solution { public String PrintMinNumber(int [] numbers) { if(numbers == null){ return null; } ArrayList<String> result = new ArrayList<>(); recur(numbers,"",result); Collections.sort(result); return result.get(0); } public void recur(int[] numbers, String cur, ArrayList<String>result){ if(numbers.length == 0){ for(int i = 0; i < result.size();i++){ if(result.get(i) == cur){ return; } } result.add(cur); } for(int i = 0; i < numbers.length; i++){ int[] temp = new int[numbers.length-1]; int count = 0; for(int j = 0; j < numbers.length;j++){ if(j != i){ temp[count] = numbers[j]; count++; } } recur(temp,cur+Integer.toString(numbers[i]),result); } } }