leetcode leetcode 451【根据字符出现频率排序】
题目链接
https://leetcode-cn.com/problems/sort-characters-by-frequency/
解题思路与代码思路:
字典排序法
第一个想法,创建字典,key是字母,value是计数,然后反序排序,按照字符串的set长度去遍历,使字母与次数相乘存到列表中,然后join连接
最大堆法
使用Counter直接计算次数,用元组负数存储次数和字符,创建最大堆,按照堆的长度做for循环,把堆顶一个个pop出来,然后让这个元组元素的key和value相乘再放进result列表,然后join连接
Counter内置函数
Counter有个内置函数叫做most_common(), 传进去一个可选参数n(代表获取数量最多的前n个元素,如果不传参数,代表返回所有结果),所以就按照了次数最大开始排序,直接相乘key和value再join,完成!
两行搞掂排序法
转换字符串为set,对每个元素按照其计数来排序,重点是那条lambda公式,巧妙运用s.count()
代码:
字典排序法
class Solution:
def frequencySort(self, s: str) -> str:
check_dict = {}
for i in s:
if i in check_dict:
check_dict[i]+=1
else:
check_dict[i] = check_dict.get(i,1)
count_dict = sorted(check_dict.items(),key=lambda item:(-item[1]))
ans = [count_dict[i][0]*count_dict[i][1] for i in range(len(set(s)))]
return ''.join(ans)
最大堆法
import collections
import heapq
class Solution:
def frequencySort(self, s: str) -> str:
count = collections.Counter(s)
res = []
heap = [(-freq,word) for word,freq in count.items()]
heapq.heapify(heap)
for i in range(len(heap)):
x = heapq.heappop(heap)
res.append(x[1]*(-x[0]))
return ''.join(res)
Counter内置函数
from collections import Counter
class Solution:
def frequencySort(self, s: str) -> str:
return ''.join(i * j for i,j in Counter(s).most_common())
两行搞掂排序法
class Solution:
def frequencySort(self, s: str) -> str:
s_list = sorted(set(s),key=lambda x:s.count(x),reverse=True)
return ''.join(([i*s.count(i) for i in s_list]))
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 字典排序法
- 时间复杂度:排序用了O(nlogn),遍历用了O(n),总共是O(nlogn)
- 空间复杂度:O(N),用于存放答案
- 最大堆法
- 时间复杂度:O(N)的时间计算频率,添加每个字母进入堆O(logk),k为有多少个字母,最多26个,总共是是O(NlogK)
- 空间复杂度:O(N)
- Counter法
- 时间复杂度:也是快排吧好像,O(nlogn)
- 空间复杂度:O(N)
- 两行搞掂排序法
- 时间复杂度:快排O(nlogn)
- 空间复杂度:O(N)