【剑指Offer】32把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
时间限制:1秒;空间限制:32768K;本题知识点:数组
解题思路
思路一
自定义两个数比较大小的函数用于排序,对于两个数a,b如果按ab顺序组成的数 > 按ba顺序组成的数,那么看作a > b;有了自定义的比较函数之后就可以按照冒泡排序的思路将输入数组从小到大排序;最后将排序后的数组连接成数字输出。
Python代码:
# -*- coding:utf-8 -*-
class Solution:
def PrintMinNumber(self, numbers):
# write code here
if numbers == []:
return ''
# 自定义比较大小函数
def Contrast(a, b):
s1 = int(str(a)+str(b))
s2 = int(str(b)+str(a))
if s1 > s2:
return 1
elif s1 < s2:
return -1
else:
return 0
# 冒泡排序
for i in range(len(numbers)-1):
for j in range(i,len(numbers)):
# 如果numbers[i] > numbers[j],交换位置
if Contrast(numbers[i], numbers[j]) == 1:
k = numbers[i]
numbers[i] = numbers[j]
numbers[j] = k
# 输出结果
s = str()
for i in range(len(numbers)):
s += str(numbers[i])
return int(s)
思路二
利用lambda表达式和sort函数、cmp函数,程序会更简洁。
sort():
list.sort(cmp=None, key=None, reverse=False)其中,cmp是一个可选参数,如果指定了该参数会使用该参数的方法进行排序。如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。
cmp():
cmp(x, y)cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
Python代码:
class Solution:
def PrintMinNumber(self, numbers):
# write code here
if not numbers: return ""
numbers = list(map(str, numbers))
numbers.sort(cmp=lambda x, y: cmp(x + y, y + x))
return int(''.join(x for x in numbers))