硬知识
sort函数结合functools.cmp_to_key(func)
sorted函数详解(高级篇)
小顶堆内置heapq模块
堆heapq模块
快速排序在选择大于标准和小于标准方面,有两个方法
ij交换
ij轮流赋值和代码
剑指 Offer 45. 把数组排成最小的数
这题学到如何改变比较函数、快速排序写法
快速排序一定要想清楚,为什么最后将第一个元素赋给low是成立的
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
给你来个元素x和y,怎么知道谁在前谁在后?
比一下就知道了,xy 和 yx哪个大。
使用快排或内置函数
快速排序:
内置函数:
class Solution:
def minNumber(self, nums: 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] # 结束时i=j,与第一个元素交换
quick_sort(l, i - 1)
quick_sort(i + 1, r)
strs = [str(num) for num in nums]
quick_sort(0, len(strs) - 1)
return ''.join(strs)
# nums = list(map(str,nums))
from functools import cmp_to_key
class Solution:
def minNumber(self, nums: 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 nums]
strs = list(map(str,nums))
strs.sort(key = cmp_to_key(sort_rule))
return ''.join(strs)
# 另外一种快速排序
class Solution:
def minNumber(self, nums: List[int]) -> str:
def quick_sort(l , r):
if l >= r: return # 只有一个元素 不需比较
i, j = l, r
part = strs[l]
while i < j:
while strs[j] + part >= part + strs[j] and i < j: j -= 1
strs[i] = strs[j]
while strs[i] + part < part + strs[i] and i < j: i += 1
strs[j] = strs[i]
strs[i] = part # 结束时i=j,与第一个元素交换
quick_sort(l, i - 1)
quick_sort(i + 1, r)
strs = [str(num) for num in nums]
quick_sort(0, len(strs) - 1)
return ''.join(strs)
剑指 Offer 61. 扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。 A 不能视为 14。
难度: 5张牌是顺子的 充分条件
直接看了答案。。。
class Solution:
def isStraight(self, nums: List[int]) -> bool:
repeat = set()
ma, mi = 0, 14
# ma, mi = max(nums), min(nums) #错误 要排除大小王,即0
for num in nums:
if num == 0: continue # 跳过大小王
ma = max(ma, num) # 最大牌
mi = min(mi, num) # 最小牌
if num in repeat: return False # 若有重复,提前返回 false
repeat.add(num) # 添加牌至 Set
return ma - mi < 5 # 最大牌 - 最小牌 < 5 则可构成顺子