题解 | #把数组排成最小的数#

把数组排成最小的数

http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993

32、把数组排成最小的数

解题思路

要注意题目的意思是把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

这道题目可以看成是一道排序的题目,因为要使得结果最小,那么给出的整数要怎么排列呢?
其实就可以转化为 A+B 与 B+A 之间比较的问题(注意:这里的A+B并不是A加上B,而是A拼上B),当A+B小于B+A的时候,很明显A要放在B的前面,这样才能使得结果小。

举个例子:

当A = 206,B = 1

此时 A+B = 2061 B+A = 1206

我们可以看到 A+B > B+A,所以很明显B需要放在A的前面,即B+A,才能使得拼出来的数字最小。

我们在来看张动图:

32

所以总体的逻辑就是:

1、先将整型数组转化为字符串型数组

2、定义特定排序规则

3、用定义的排序规则对字符串型数组进行排序

4、将字符串型数组中每个元素拼接起来

5、得到最小的数

代码:

Java版

public String PrintMinNumber(int [] numbers) {
        if(numbers == null || numbers.length == 0)
            return "";
        int n = numbers.length;
        String[] nums = new String[n];
        // 先将整型数组转化为字符串型数组
        for(int i = 0; i < n; i++){
            nums[i] = numbers[i]+"";
        }
        // 用定义的排序规则对字符串型数组进行排序
        Arrays.sort(nums,(s1,s2)->{
           return (s1+s2).compareTo(s2+s1);
        });

        StringBuffer sb = new StringBuffer();
        // 将字符串型数组中每个元素拼接起来
        for(String num:nums)
            sb.append(num);
        return sb.toString();
    }

复杂度分析:

时间复杂度 O(NlogN) : N 为 nums数组的长度 ;使用内置函数的平均时间复杂度为 O(NlogN) ,最差为 O(N 2 ) 。
空间复杂度 O(N) : 字符串数组 nums占用线性大小的额外空间。

剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论
动图速度好快
点赞 回复 分享
发布于 2022-03-17 17:02
666
点赞 回复 分享
发布于 2022-02-16 20:30
大佬牛逼
点赞 回复 分享
发布于 2021-12-27 20:29

相关推荐

不愿透露姓名的神秘牛友
07-18 18:30
点赞 评论 收藏
分享
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
11
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务