把数组排成最小的数
时间限制: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'}]