最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指Offer上刷了几道题目,发现对复习知识点还是很有用的,做到重建二叉树这块。递归传值出了点问题,debug半小时才找出错误,所有还是写篇博客记录一下。也推荐要找工作的伙伴去剑指Offer刷题。
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
一看这个问题第一反应该是全排列的问题,数组中3个元素,也就是A33 = 3X2X1=6,就是高中学的排列问题,这种问题直接DFS就可以了,下面贴代码:
static long flag[] = new long[1000];
static long value[] = new long[1000];
public static String PrintMinNumber(int [] numbers) {
return "" + dfs(numbers,numbers.length,0);
}
public static String dfs(int [] numbers,int count,int index){
if(index == count ){
StringBuffer str = new StringBuffer("");
for(int i = 0 ; i < count ; i++){
str.append(value[i]);
}
System.out.println(str);
return str.toString();
}
String min = "99999999999999999999999";
for(int i = 0 ; i < count ; i++){
if(flag[i] == 0){
flag[i] = 1;
value[index] = numbers[i];
String temp = dfs(numbers,numbers.length,index+1);
if(min.compareTo(temp) > 0) {
min = temp;
}
flag[i] = 0;
}
}
return min;
}
public static void main(String[] args) {
String minNumber = PrintMinNumber(new int[] {3334,3,3333332});
// String minNumber = PrintMinNumber(new int[] {32,3,321});
System.out.println("最小的字符串为"+minNumber);
}
333433333332
333433333323
333343333332
333333323334
333333233343
333333233334
最小的字符串为: 333333233334
之前我是用Int型来返回数据的,结果oj系统数据太大,超出范围了,我换成Long也不行,所以我就直接返回String就好了,最后对每个字符串进行字典排序就行了。