0327

某编程教育机构对学生进行了问卷调查,调查结果用来进行完善教研工作。负责人创建了列表 reviews 存放由小写字母和空格组成的调查结果,以及列表 languages 存放由小写字母组成的不同编程语言。负责人设计了几个分析需求,其中,你需要协助负责人实现的需求是:根据负责人提供的语言列表 languages,整理出 reviews 中出现频率最高的前 k 种语言。

注意:

合计返回前 k 种,其中如果有频率相同的,则按照字典序取前面的。
若同一个调查结果中,某编程语言出现多次,只统计一次。
只统计完整出现的编程语言拼写,且单词间须有空格间隔才可被正常统计,例如:“javascript is great”中, “java"出现次数为 0,“javascript”出现次数为 1。
示例 1:

输入:reviews = [“pythonjava is good”,"i love cpp"], languages = ["python", "java", "cpp"], k = 2
输出:["cpp","java"]
解释:reviews 中由于“python”与"java"间没有空格,故"java"出现 0 次,"python"出现 0 次;"cpp"出现 1 次
示例 2:

输入:reviews = ["i love python and cpp", "i love java", "i love python more than go but go is nice as well", "python is great", "i love cpp", "i love java so much"], languages = ["python", "java","cpp", "go"], k = 2
输出:["python", "cpp"]
解释:reviews 中"python"出现 3 次,"java"出现 2 次,"cpp"出现 2 次,"go"出现 1 次;cpp 和 java 字典排序 cpp 在前。故返回:"python" 和 "cpp"

提示:

1 <= reviews.length, languages.length <= 10000
1 <= reviews[i].length <= 1000
1 <= k <= 20,并保证 k <= languages.length
1 <= language[i].length <= 20
字典序:是指按照单词出现在字典的顺序进行排序的方法。先按照第一个字母、以 a、b、 c......z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比 到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

答题要求:结果可信和过程可信同样重要,您编写的代码需要符合可信的要求(包括通用编码规范、安全编码规范和圈复杂度)。

 

考点:map按照value排序

【参考代码】

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;


using PAIR =  pair<string, int>;

bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {
  return lhs.second < rhs.second;
}

struct CmpByValue {
    bool operator()(const PAIR& lhs, const PAIR& rhs) {
        return lhs.second > rhs.second;
    }
};

ostream& operator<<(ostream& out, const PAIR& p) {
  return out << p.first << "\t" << p.second;
}

vector<string> FindLanguages(vector<string>& reviews, vector<string>& languages, int k)
{
    vector<string>ret;
    map<string, int>lanMap;
    for (size_t j = 0; j < languages.size(); j++) {
        lanMap.insert(make_pair(languages[j], 0));
    }

    for (size_t i = 0; i < reviews.size(); i++) {
        string str = reviews[i];
        for (size_t j = 0; j < languages.size(); j++) {
            size_t found = str.find(languages[j]);
            if (found != std::string::npos) {
                lanMap[languages[j]]++;
            }
        }
    }

    vector<PAIR> lanVec(lanMap.begin(), lanMap.end());
    sort(lanVec.begin(), lanVec.end(), CmpByValue());

    for (auto it : lanVec) {
        // cout << *it << endl; // error: no match for 'operator*' (operand type is 'std::pair<std::basic_string<char>, int>')
        cout << it << endl;
    }

    for (auto it = lanVec.begin(); it != lanVec.end() && k > 0; it++, k--) {
        ret.push_back((*it).first);
    }

    return ret;
}

int mainstrings()
{
    vector<string>reviews = {"pythonjava is good","i love cpp"};
    vector<string>languages = {"python", "java", "cpp"};
    int k = 2;
    vector<string>ret;
    ret = FindLanguages(reviews, languages, k);

    for_each(ret.begin(), ret.end(), [](const string& it) {
        cout << it << endl;
    });
    return 0;
}

  

 

posted @ 2020-03-28 10:07  ren_zhg1992  阅读(749)  评论(0)    收藏  举报