c++实现给一非空的单词列表,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。 输入:第1行为k值,第2行单词列表,单词列表以end结尾,end不属于单词列表中的单词。 2 i love leetcode i love coding end 输出: i love
时间: 2024-02-05 19:13:50 浏览: 142
下面是一种基于哈希表和堆的实现方法:
```c++
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <queue>
using namespace std;
struct WordFreq {
string word;
int freq;
bool operator<(const WordFreq& other) const {
return freq == other.freq ? word > other.word : freq < other.freq;
}
};
vector<string> topKFrequentWords(vector<string>& words, int k) {
unordered_map<string, int> freqMap;
for (const auto& word : words) {
++freqMap[word];
}
priority_queue<WordFreq> pq;
for (const auto& pair : freqMap) {
pq.push({pair.first, pair.second});
if (pq.size() > k) {
pq.pop();
}
}
vector<string> result(k);
for (int i = k - 1; i >= 0; --i) {
result[i] = pq.top().word;
pq.pop();
}
return result;
}
int main() {
int k;
cin >> k;
vector<string> words;
string word;
while (cin >> word && word != "end") {
words.push_back(word);
}
vector<string> result = topKFrequentWords(words, k);
for (const auto& word : result) {
cout << word << " ";
}
cout << endl;
return 0;
}
```
对于每个单词,我们使用一个哈希表(unordered_map)统计它出现的频率。然后使用一个大小为 k 的最小堆(priority_queue)来维护前 k 个出现频率最高的单词。堆中存储的是单词的结构体 WordFreq,包含单词本身和它的出现频率。使用自定义的比较运算符 < 来按照题目要求进行排序。遍历完所有单词后,堆中剩余的 k 个单词就是答案,需要依次弹出并存储在一个结果数组中。最后输出结果即可。时间复杂度为 O(nlogk),其中 n 是单词的总数。
阅读全文