黑马程序员技术交流社区

标题: 【上海校区】:把数组排成最小的数 [打印本页]

作者: 梦缠绕的时候    时间: 2019-9-12 14:48
标题: 【上海校区】:把数组排成最小的数
一、引子
这个系列是我在牛客网上刷《剑指Offer》的刷题笔记,旨在提升下自己的算法能力。
查看完整的剑指Offer算法题解析请点击CSDN和github链接:
剑指Offer完整习题解析CSDN地址
github地址
二、题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1、思路
遇到这个题,全排列当然可以做,但是时间复杂度为O(n!)。在这里我们自己定义一个规则,对拼接后的字符串进行比较。
排序规则如下:
若ab > ba 则 a 大于 b, 例子:a=3 b=32 ab=332 ba=323 所以a大于b 下面的规则和这个比较方法一致
若ab < ba 则 a 小于 b,
若ab = ba 则 a 等于 b;
根据上述规则,我们需要先将数字转换成字符串再进行比较,因为需要串起来进行比较。比较完之后,按顺序输出即可。
2、编程实现
python
代码实现方案:
# -*- coding:utf-8 -*-class Solution:    def PrintMinNumber(self, numbers):        # write code here        if numbers is None:            return ""        lens = len(numbers)        if lens ==0 :            return ""        tmpNumbers = sorted(numbers,cmp=self.compare)        return int(''.join(str(x)for x in tmpNumbers))    def compare(self,num1,num2):        t = str(num1)+str(num2)        s = str(num2)+str(num1)        if t>s:            return 1        elif t<s:            return -1        else:            return 0

作者: 梦缠绕的时候    时间: 2019-9-12 14:49
有任何问题欢迎在评论区留言
作者: 梦缠绕的时候    时间: 2019-9-12 14:49
或者添加学姐微信
DKA-2018




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2