剑指offer(34):把数组排成最小的数

来源:互联网 发布:淘宝怎么才能搜到黄盘 编辑:程序博客网 时间:2024/05/29 18:49

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

直接做法:
求出这个数组中所有数字的全排列,求出拼起来的数字中的最小值即可。此时n个数字共有n!个排列。

另外一种思路是:
寻找一种排序规则,按照该规则排序之后能够排成一个最小的数字。两两相邻的两个数字m、n,简单组合为mn、nm,对mn、nm进行大小排序,对所有数字按照该规则进行排序,则容易得到最小的而数字。考虑到题目并没有对数字的大小进行限制性的描述,2个int类型的数字组合后很可能发生溢出。因此需要解决隐藏的大数问题。将数字数组转为字符串数组后,两个字符串直接相加“+”操作就能够实现原来的相邻数字的两两组合。考虑到java.util.Arrays类库中提供了Arrays.sort()方法(时间复杂度为O(nlogn),已经远小于直接求全排列的n!),指定排序规则的匿名类Comparator,如果对时间效率没有更高的要求,就可以使用这种方法。

下面为牛客AC代码:

import java.util.Arrays;import java.util.Comparator;public class Solution {    public String PrintMinNumber(int [] numbers) {        if(numbers == null || numbers.length <= 0)            return "";        // 转为String数组        int length = numbers.length;        String[] strArr = new String[length];        for(int i = 0; i < length; i++) {            strArr[i] = String.valueOf(numbers[i]);        }        // 匿名类指定比较器,指定排序规则进行排序        Arrays.sort(strArr, new Comparator<String>() {           public int compare(String str1, String str2) {               return (str1 + str2).compareTo(str2 + str1);           }        });        // 将从小到大的字符串数组组合为最小字符串,即最小数字        StringBuffer sb = new StringBuffer();        for(String str : strArr) {            sb.append(str);        }        return sb.toString();    }}

参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大专不过统招线怎么办 雅安停天然气了怎么办 调档函过期了怎么办 临时工想涨工资怎么办 辞职了职称公需课怎么办 一师一优课有账号忘记密码怎么办? 长沙转户口档案怎么办 二战迁户口档案怎么办 本人户口页丢失怎么办 户口迁出原籍档案怎么办 户口本丢了一页怎么办 户口本少了一页怎么办 户口页丢了怎么办 公司要社保卡怎么办 公务员面试缺考怎么办 word文档未标签怎么办 暂住证到期了怎么办t 考驾照没暂住证怎么办 南京暂住证过期了怎么办 南京桥北暂住证怎么办 冠状沟红痒一年多了怎么办 介仓身上痒怎么办 专升本考试怎么办 专升本毕业论文怎么办 手机扫码模糊怎么办 iphone相册闪退怎么办 快件签收扫描失败怎么办 创业迷茫的时候怎么办 月经期间腰酸痛怎么办 被重庆微跑骗了怎么办 遴选到中央房子怎么办 转了户口社保怎么办 政府咨询电话打不通怎么办 公务员准考证丢了怎么办 行测老打40多分怎么办 网上没有报名的怎么办? 上大学转户口怎么办 梅菜扣肉勾芡怎么办 有个精神病妈妈怎么办 妈得了精神病该怎么办 思维不正常的人怎么办