最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指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就好了,最后对每个字符串进行字典排序就行了。
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦