示范一道题:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
import java.util.*;
public class Solution {
/*
解题思路:
1.将整数数组转化成字符串
2.进行全排列 然后拼接字符串
3.将所有的拼接的结果存放在一个列表中
4。将列表进行循环 然后找到最小的 返回结果
5.当数组为空的时候 需要进行特殊情况的处理
*/
private LinkedList<String> list=new LinkedList<String>();
public String PrintMinNumber(int [] numbers) {
String result="";//局部变量中需要进行初始化 要么就直接进行赋表达式 否则必须进行初始化
if(numbers.length<=0)
return result;
String s[]=new String[numbers.length];
for(int i=0;i<numbers.length;i++){
s[i]=String.valueOf(numbers[i]);
}
permutation(s,0,s.length);
long mix=Long.valueOf(list.get(0));
for(String str:list){
long num=Long.valueOf(str);
if(mix>num)
mix=num;
}
result=String.valueOf(mix);
return result;
}
public void swap(String[] arr, int i, int j) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// k表示当前选取的数在数组中的位置下标,m是要排列的数组的长度.
public void permutation(String[] arr, int k, int m) {
// 当前位置与数组最后一个位置重合时,此时打印排列数.
if (k == m - 1) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<arr.length;i++){
sb.append(arr[i]);
}
list.add(sb.toString());
System.out.println(sb.toString());
} else {
for (int i = k; i < m; i++) {
// 当前位置元素与后面位置的元素依次替换
swap(arr, k, i);
permutation(arr, k + 1, m);
// 将位置换回来,继续做下一个排列.
// System.out.println("..k=" + k + " m=" + m + " i=" + i);
swap(arr, k, i);
}
}
}
}