• 【LeetCode】 前K个高频单词 两种解法


    给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

    返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

    示例 1:

    输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
    输出: ["i", "love"]
    解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
        注意,按字母顺序 "i" 在 "love" 之前。
    

    示例 2:

    输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
    输出: ["the", "is", "sunny", "day"]
    解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,
        出现次数依次为 4, 3, 2 和 1 次。
    

    注意:

    • 1 <= words.length <= 500
    • 1 <= words[i] <= 10
    • words[i] 由小写英文字母组成。
    • k 的取值范围是 [1, 不同 words[i] 的数量]

    思路:

    首先想到了map做键值对映射,记录单词的出现次数,最后造个数组排序就行,但是面试一紧张忘了map怎么用了,只能另辟蹊径,改用C++结构体,分别记录单词,出现次数,是否是第一次出现

    结构体解法:

    1. struct ac {
    2. string word;
    3. int num;
    4. int flag;
    5. } a[505];
    6. bool cmp(ac a, ac b) {
    7. if (a.num == b.num) {
    8. return a.word < b.word;
    9. }
    10. return a.num > b.num;
    11. }
    12. class Solution {
    13. public:
    14. vector topKFrequent(vector& words, int k) {
    15. vector res;
    16. int i, j;
    17. for (i = 0; i < words.size(); i++) {
    18. // cout<
    19. a[i].word = words[i];
    20. a[i].num = 0;
    21. a[i].flag = 0;
    22. }
    23. for (i = 0; i < words.size(); i++) {
    24. for (j = 0; j < words.size(); j++) {
    25. if (a[j].word == words[i]) {
    26. if (a[j].num != 0)
    27. a[j].flag = 1;
    28. a[j].num++;
    29. }
    30. }
    31. }
    32. sort(a, a + words.size(), cmp);
    33. for (i = 0; i < words.size(); i++) {
    34. cout << "--" << a[i].word << " " << a[i].num << endl;
    35. }
    36. for (i = 0; i < words.size(); i++) {
    37. if (i != 0 && a[i].word == a[i - 1].word)
    38. continue;
    39. res.push_back(a[i].word);
    40. // cout << a[i].word << endl;
    41. k--;
    42. if (k <= 0)
    43. break;
    44. }
    45. return res;
    46. }
    47. };

    map解法:

    1. struct ac {
    2. string word;
    3. int num;
    4. int flag;
    5. } a[505];
    6. bool cmp(ac a, ac b) {
    7. if (a.num == b.num) {
    8. return a.word < b.word;
    9. }
    10. return a.num > b.num;
    11. }
    12. class Solution {
    13. public:
    14. vector topKFrequent(vector& words, int k) {
    15. vector res;
    16. int i, j;
    17. mapint> mp;
    18. // for (i = 0; i < 6; i++) {
    19. // string s;
    20. // cin >> s;
    21. // words.push_back(s);
    22. // }
    23. for (i = 0; i < words.size(); i++) {
    24. // cout<
    25. mp[words[i]]++;
    26. }
    27. i = 0;
    28. mapint>::iterator it;
    29. for (it = mp.begin(); it != mp.end(); it++) {
    30. a[i].word = it->first;
    31. a[i].num = it->second;
    32. i++;
    33. }
    34. sort(a, a + i, cmp);
    35. // for (i = 0; i < words.size(); i++) {
    36. // cout << "--" << a[i].word << " " << a[i].num << endl;
    37. // }
    38. for (i = 0; i < k; i++) {
    39. res.push_back(a[i].word);
    40. // cout<
    41. }
    42. return res;
    43. }
    44. };

  • 相关阅读:
    猿创征文|Python迭代器、生成器、装饰器、函数闭包
    文献 | 教师主观幸福感变迁:横断历史研究的视角
    芒果改进YOLOv5系列:首发结合最新NIPS2022华为诺亚的GhostNetV2 架构:长距离注意力机制增强廉价操作,打造高效轻量级检测器
    FPGA HLS 基于stream的池化单元 hls优化&约束
    Android问题笔记 - NoSuchmethodException: could not find Fragment constructor
    网工内推 | 运维工程师,软考认证优先,全额社保
    不一样的旅拍方式,用三维重建记录“恶魔之眼”
    计算机基础 - 原码,反码,补码
    并查集
    有向图的强连通分量——学校网络
  • 原文地址:https://blog.csdn.net/Xylon_/article/details/134081158