451. 根据字符出现频率排序(哈希表)

题目描述:

算法实现:

本题主要通过哈希表进行实现,使用unordered_map实现哈希表,当然也可以使用map,两者区别在于一个有序,一个无序(简单的讲)

  • 首先定义一个unordered_map<char,int> mp(<字符,出现次数>),实现哈希表,实现对string中的字符出现个数进行计数。
  • map的使用方法相比大家很熟悉,这里的mp的first存储的为字符,second存储的为出现的次数。使用'.'可以直接访问。
  • 为了便于输出,定义一个容器vector<pair<char,int>> vec,用于存储mp中的元素。接下来就只需要对vec进行操作了。
  • 题目要求按照出现次数的大小进行输出,出现次数越大,提前输出,因此需要对vec进行排序,按照second从大到小排序,在这里题目虽然没有要求一样的出现次数如何输出,我在这里定义,出现次数相同时,按照字典序输出。
  • 遍历vec,对元素进行输出。

 代码实现:

class Solution {
public:
    string frequencySort(string s) {
        unordered_map<char, int> mp;
        for (auto &ch : s) {
            mp[ch]++;
        }
        vector<pair<char, int>> vec;
        for (auto &it : mp) {
            vec.push_back(it);
        }
        sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b) {
            if(a.second==b.second){
                return a.first<b.first;
            }
            return a.second > b.second;
        });
        string ret;
        for (auto &ch : vec) {
            for (int i = 0; i < ch.second; i++) {
                ret.push_back(ch.first);
            }
        }
        return ret;
    }
};

将cmp函数定义在sort外面:

class Solution {
   static bool cmp(const pair<char, int> &a, const pair<char, int> &b){
       if (a.second == b.second) {
				return a.first<b.first;
			}
			return a.second > b.second; 
    }
public:
	string frequencySort(string s) {
		unordered_map<char, int> mp;
		int length = s.length();
		for (auto &ch : s) {
			mp[ch]++;
		}
		vector<pair<char, int>> vec;//利用vector对map进行排序
        unordered_map<char, int>::iterator it;
		for (it=mp.begin();it!=mp.end();it++) {
			vec.emplace_back(*it);
		}
		sort(vec.begin(), vec.end(),cmp);
		string ret;
        vector<pair<char, int>>::iterator p;
		for (p=vec.begin();p!=vec.end();p++) {
			for (int i = 0; i <(*p).second; i++) {
				ret.push_back((*p).first);
			}
		}
		return ret;
	}
};

 我发现一个很好用的变量方法,当然也是使用for

for (auto &ch : vec) 

这里的auto关键字真是太香了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值