【剑指offer】把数组排成最小的数(python)

1. 重写排序

使用匿名函数lambda和cmp函数:

(cmp(x,y)如果x<y,则返回-1,如果x=y,则返回0,如果x>y,则返回1)

sorted(a,lambda x,y:cmp(x,y) # 正序排列
sorted(a,lambda x,y:-cmp(x,y) # 倒序排列
这里比较字符串s1和s2的大小,定义为比较s1+s2和s2+s1的大小,如果s1+s2<s2+s2,应该s1在前。
compare = lambda n1,n2: int(str(n1)+str(n2))-int(str(n2)+str(n1))
array = sorted(numbers, cmp=compare)

力扣791:自定义字符串排序

S 已经根据某种规则进行了排序。我们要根据S中的字符顺序对T进行排序。更具体地说,如果S中x在y之前出现,那么返回的字符串中x也应出现在y之前。
sorted(iterable, cmp=None, key=None, reverse=False)
  • iterable -- 可迭代对象。
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
用key 来排序,根据S中x的顺序判定排序顺序。
def customSortString(self, S, T):
        """
        :type S: str
        :type T: str
        :rtype: str
        """
        return ''.join(sorted(list(T), key=lambda x:S.find(x)))
这里Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。

2. 数组转字符串

首选将Int 转为string
numbers = [ int(x) for x in numbers ]
# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers: return ''
        n = len(numbers)
        if n== 1: return numbers[0]
        compare = lambda n1,n2: int(str(n1)+str(n2))-int(str(n2)+str(n1))
        array = sorted(numbers, cmp=compare)
        array = [ str(x) for x in array ]
        return ''.join(array)