为了账号安全,请及时绑定邮箱和手机立即绑定

剑指Offer-把数组排成最小的数

标签:
Java 算法

最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指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人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7796
获赞与收藏
665

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消