【leetcode 451】【根据字符出现频率排序】

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}{复杂度分析:}
  1. 字典排序法
  • 时间复杂度:排序用了O(nlogn),遍历用了O(n),总共是O(nlogn)
  • 空间复杂度:O(N),用于存放答案
  1. 最大堆法
  • 时间复杂度:O(N)的时间计算频率,添加每个字母进入堆O(logk),k为有多少个字母,最多26个,总共是是O(NlogK)
  • 空间复杂度:O(N)
  1. Counter法
  • 时间复杂度:也是快排吧好像,O(nlogn)
  • 空间复杂度:O(N)
  1. 两行搞掂排序法
  • 时间复杂度:快排O(nlogn)
  • 空间复杂度:O(N)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值