闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是:
一个拥有密码所有元素的非负整数数组 password
密码是 password 中所有元素拼接后得到的最小的一个数
请编写一个程序返回这个密码。
示例 1:
输入: password = [15, 8, 7]
输出: “1578”
示例 2:
输入: password = [0, 3, 30, 34, 5, 9]
输出: “03033459”
https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/description/
解题思路:
此题求拼接起来的最小数字,本质上是一个排序问题。设数组 password 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:
若拼接字符串 x+y>y+x ,则 x “大于” y ;
反之,若 x+y<y+x ,则 x “小于” y ;
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
根据以上规则,套用任何排序方法对 password 执行排序即可。
算法流程:
初始化: 字符串列表 strs ,保存各数字的字符串格式;
列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
返回值: 拼接 strs 中的所有字符串,并返回。
下图中 nums 对应本题的 password 。
class Solution:
def crackPassword(self, password: List[int]) -> str:
def quick_sort(l , r):
if l >= r: return
i, j = l, r
while i < j:
while strs[j] + strs[l] >= strs[l] + strs[j] and i < j: j -= 1
while strs[i] + strs[l] <= strs[l] + strs[i] and i < j: i += 1
strs[i], strs[j] = strs[j], strs[i]
strs[i], strs[l] = strs[l], strs[i]
quick_sort(l, i - 1)
quick_sort(i + 1, r)
strs = [str(num) for num in password]
quick_sort(0, len(strs) - 1)
return ''.join(strs)
class Solution:
def crackPassword(self, password: List[int]) -> str:
def sort_rule(x, y):
a, b = x + y, y + x
if a > b: return 1
elif a < b: return -1
else: return 0
strs = [str(num) for num in password]
strs.sort(key = functools.cmp_to_key(sort_rule))
return ''.join(strs)