【牛客剑指offer刷题】:Python:32.把数组排成最小的数

把数组排成最小的数

时间限制:1秒 空间限制:32768K 热度指数:222806
本题知识点: 数组
算法知识视频讲解

题目描述

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

解析

将a和b转为string后,若 a+b<b+a 则 a排在在前

2 21
因为 “21 2” < “2 21” 所以排序后为 “21 2

1.代码

# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers:
            return ""
        lmb = lambda n1, n2:int(str(n1) + str(n2)) - int(str(n2) + str(n1))
        array = sorted(numbers, cmp = lmb)
        return "".join([str(i) for i in array])


update:2019年10月6日

2.冒泡排序法

将数组中的数字连接起来,排成一个最小的数字。将’大数’往后放’小数’往前放,如何定义’大数’和’小数’?比如说有两个数a和b,如果ab>ba则a是’大数’b是’小数’,要排成ba。
于是,这道题目变成了一个排序问题,将能把组合出来的数字变大的数字往后排。我们这里需要自己定义一个比大小的比较方法。用冒泡排序,可以解决此题。

代码

# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        n = len(numbers)
        if n == 0:
            return ""
        for i in range(n - 1, 0, -1):
            for j in range(i):
		        if int(str(numbers[j]) + str(numbers[j + 1]))\
		                        > int(str(numbers[j + 1]) + str(numbers[j])):
		            numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
		return "".join(list(map(lambda x: str(x), numbers)))

链接:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993?answerType=1&f=discussion
来源:牛客网


其他

1.Python的map函数

python中的map()函数应用于每一个可迭代的项,返回的是一个结果list。map()接受两个参数,一个是函数,一个是序列。

实例:map(function,iterable,…)

list(map(str,[1,2,3,4,5,6,7,8])) # 把数字转换为字符串
>>> [1,2,3,4,5,6,7,8]

list(map(lambda x:x**2,[1,2,3,4,5]))#使用lambda匿名函数
>>> [1,4,9,16,25]

2.Python的sorted函数

如果我想降序排序呢,这时就要自定义cmp方法(当然更方便的是numbers.sort(reverse=True))

numbers=[5,2,9,7]
numbers.sort(lambda a,b:b-a)
numbers
[9,7,5,2]

如果数组成员不是数字,而是其它的类型例如dict,想根据某个属性来排序

persons=[{'name':'zhang3','age':15},{'name':'li4','age':12}]
persons
[{'name':'zhang3','age':15},{'name':'li4','age':12}]
persons.sort(lambda a,b:a['age']-b['age'])
persons
[{'age': 12, 'name': 'li4'}, {'age': 15, 'name': 'zhang3'}]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值