正题之前
三玖yyds!!!
题目
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:
nums = [10,2]
输出:"210"
示例 2:
输入:
nums = [3,30,34,5,9]
输出:"9534330"
题目链接:click here
思路
此题求拼接起来的最大数字。设数组nums 中任意两数字的字符串为 x 和 y,则规定 贪心策略:
若拼接字符串 x+y>y+x,则x“大于”y 。
反之,若 x+y<y+x,则 x“小于” y。
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
根据以上规则,套用排序方法对 nums 执行排序即可。
详细题解:. - 力扣(LeetCode)
python代码
class Solution:
def largestNumber(self, nums: List[int]) -> str:
# 自定义比较函数
def _myfunc(a,b):
return int(str(a)+str(b))-int(str(b)+str(a))
# nums按照自定义函数排序
nums.sort(key=cmp_to_key(_myfunc), reverse=True)
# 拼接为字符串
ans=""
for i in nums:
ans+=str(i)
# 防止ans中元素均为"0"
if ans[0]=='0':
return '0'
return ans
这段代码定义了一个Solution类,其中包含一个名为largestNumber的方法。该方法接受一个整数列表nums作为输入,并返回一个字符串。在方法中,我们首先定义了自定义的比较函数_myfunc,然后使用该函数对nums进行排序。最后,我们将排序后的数字拼接成一个字符串,并检查第一个字符是否为0,如果是,则返回"0",否则返回拼接后的字符串。
这种方法非常巧妙地利用了Python的内置排序函数和自定义比较函数,以及对字符串和整数的转换操作,来解决了一个看似复杂的问题
注意事项
- sort中用到的排序函数不可用lambda定义,因为lambda定义的函数只能接受一个参数,所以只能def定义一个比较函数,再用functools.cmp_to_key将def定义的比较函数转为关键字函数,之后传给sort中的key
- 当ans中都是‘0’时,只能返回一个‘0’
结语
希望这篇博客能够帮助你更好地理解Python中的排序和比较函数,并激发你对算法和数据结构的兴趣。如果你有任何疑问或建议,欢迎在评论区留言,让我们一起讨论!