把数组排成最小的数
时间限制:1秒空间限制:32768K
算法知识视频讲解
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
首先我们很容易想到全排列,但全排列时间复杂度为O(n!)。
所以在这里我们需要根据题意发现其中数学规律,然后定义一个规则,对拼接后的字符串进行比较。
这里排序规则如下:
◾若ab > ba 则 a 大于 b,
◾若ab < ba 则 a 小于 b,
◾若ab = ba 则 a 等于 b;
根据上述规则,我们需要先将数字转换成字符串再进行比较。比较完之后,按顺序输出即可。
C++
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
int length = numbers.size();
if(length == 0){
return "";
}
sort(numbers.begin(), numbers.end(), cmp);
string res;
for(int i = 0; i < length; i++){
res += to_string(numbers[i]);
}
return res;
}
private:
// 升序排序
static bool cmp(int a, int b){
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;
}
};
python
1.运用lambda表达式结合cmp()函数及串的”+”操作,完成对数组内每两个串相”加:(连)后结果进行比较的过程,之后sorted()对数组内所有数进行排序后返回 ,join函数拼接后输出
先放一下代码:
# -*- coding:utf-8 -*-
class Solution:
def PrintMinNumber(self, nums):
if len(nums) == 0:
return ''
comp = lambda a, b:cmp(str(a) + str(b), str(b) + str(a))
min_str = sorted(nums, cmp = comp)
return ''.join(str(string) for string in min_str)
描述
cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
语法
cmp( x, y )
参数
x – 数值表达式。
y – 数值表达式。
返回值
如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
>sorted() 函数对所有可迭代的对象进行排序操作。
语法
sorted 语法:
sorted(iterable[, cmp[, key[, reverse]]])
参数说明:
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值
返回重新排序的列表list。
例:
sorted()函数对list进行排序:
sorted([36, 5, -12, 9, -21])
#输出[-21, -12, 5, 9, 36]
关于sorted(iterable,cmp,key,reverse)
1、基础的序列升序排序直接调用sorted()方法即可
例子:
ls = list([5, 2, 3, 1, 4])
new_ls = sorted(ls)
#或者使用ls.sort()即可,直接将ls改变
print(new_ls)
print(sorted({8: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))
输出为:[2, 3, 4, 5, 8]
这也是该解法中所用到的方式,相当方便灵活,可以指定传入对象内的某个元素某部分进行比较并返回值从而影响排序结果
list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
print(sorted(list1,cmp = lambda x,y: cmp(x[0],y[0])))#按照第一个位置的字母序排序
#输出[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
print(sorted(list1,cmp = lambda x,y: cmp(x[1],y[1])))#按照第二个位置的数字序排序
#输出[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]
3、添加key参数,key 是带一个参数的函数
list.sort()和sorted()函数使用key参数来指定一个函数,此函数将在每个元素比较前被调用。
例如通过key指定的函数来忽略字符串的大小写
1 print(sorted("This is a test string from Andrew".split(), key=str.lower))
2 #输出为:['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
print(sorted(list1,reverse = True))#逆转
#输出[('sara', 80), ('mary', 90), ('lily', 95), ('david', 90)]
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
join()在python中主要是用来格式化做字符串拼接,而lambda其实是起到一个函数速写的作用,允许方便简洁的在代码内嵌入一个函数的定义(但在有些情况下会导致代码可读性降低,所以建议在逻辑有限的情况下使用lambda表达式,如果逻辑过于复杂,代码阅读起来会相对困难)。在之前的博客里中已经已经有过详细介绍,这里不再赘述
join()函数
https://blog.csdn.net/ego_bai/article/details/80481262
lambda表达式
https://blog.csdn.net/ego_bai/article/details/80521657
再放一次代码:
# -*- coding:utf-8 -*-
class Solution:
def PrintMinNumber(self, nums):
if len(nums) == 0:
return ''
comp = lambda a, b:cmp(str(a) + str(b), str(b) + str(a))
min_str = sorted(nums, cmp = comp)
return ''.join(str(string) for string in min_str)
将数组中的数字转换成string进行操作比较,比较规定如下
任意两个str1 和str2进行比较
首先连接成
num1 = str1+str2
num2 = str2+str1
转换成int型
① intnum1 > intnum2 str1>str2
② intnum1 < intnum2 str2>str1
③ intnum1==intnum2 str1=str2
代码:
# -*- coding:utf-8 -*-
class Solution:
def PrintMinNumber(self, numbers):
if not numbers:
return ''
numstr = map(str,numbers) #用str方式将int型数字转换成string
l = lambda n1,n2:int(n1+n2)-int(n2+n1)# 指定比较方式
numsort = sorted(numstr,cmp=l) #用特定的比较方式进行比较
return "".join(i for i in numsort) #拍完序之后用join进行连接成结果