【排序】leetcode--第451题--根据字符出现频率排序--(python版)

题目描述

给定一个字符串,请将字符串里的字符按照出现的频率降序排列

示例 :

输入:
“tree”
输出:
“eert”
解释:
'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。

解题思路

按照字符出现的频数进行排序,频数统计使用字典储存,可以考虑使用以下三种方法求解:
(1) 调用python自带的sort函数,对字符频数进行排序
(2) 利用桶排序,将字符频数相同的字符放进一个桶里,按频数大小,依次将桶里数据读取出来
(3) 利用最大堆,堆顶为出现频数最大的字符,按频数大小依次将字符读取出来

具体代码

法一:调用sort函数

# 法一 调用sort函数
class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 构建字典统计频数
        count_dict = {}
        count = []
        key_list = []
        for str_s in s:
            if str_s not in count_dict:
                count_dict[str_s] = 0
            count_dict[str_s] += 1
        for key, value in count_dict.items():
            count.append((key,value))
        # 利用sort函数对频数逆序排序
        count.sort(key=lambda x:x[1],reverse=True)
        for k in count:
            if int(k[1]) > 1:
                key_list.append(k[0]*int(k[1]))
            else:
                 key_list.append(k[0])
        return ''.join(key_list)

法二:桶排序

# 桶排序
class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 构建字典统计频数
        count_dict = {}
		list = []
		for str_s in s:
		    if str_s not in count_dict:
		        count_dict[str_s] = 0
		    count_dict[str_s] += 1
		# 创建桶数组
		bucket = [[]for _ in range(len(s)+1)]
		# 按频数大小分别放进各个桶里,桶的索引(下标)为字符出现的频数,桶里的值为该字符
		for key, value in count_dict.items():
		    bucket[value].append(key*value)
		# print(bucket)
		# 逆序读取桶里的字符,即按照频数大小降序排列读取
		for index in range(len(bucket)-1,-1,-1):
		    if bucket[index]:
		        list.extend(bucket[index])
		return ''.join(list)

法三:最大堆

import heapq as hp
class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 构建字典统计频数
        count_dict = {}# 创建堆
        heap  = []
        hp.heapify(heap)
        for str_s in s:
            if str_s not in count_dict:
                count_dict[str_s] = 0
            count_dict[str_s] += 1
        # 将(value,key)添加进堆,并按照value值进行排序
        # heapq库创建的堆本是最小堆,这里加个负号取反,即实现最大堆
        for key in count_dict:
            for count in range(count_dict[key]):
                hp.heappush(heap,(-count_dict[key],key))
		# 将堆的值读取出来
        list = [hp.heappop(heap)[1] for _ in range(len(s))]
        return ''.join(list)

你可能感兴趣的:(刷题)