题目描述
给定String类型的数组strArr,再给定整数k,请严格按照排名顺序打印 出次数前k名的字符串。
[要求]
如果strArr长度为N,时间复杂度请达到O(N \log K)O(NlogK)
输出K行,每行有一个字符串和一个整数(字符串表示)。
你需要按照出现出现次数由大到小输出,若出现次数相同时字符串字典序较小的优先输出
示例1
输入
["1","2","3","4"],2
返回值
[["1","1"],["2","1"]]
示例2
输入
["1","1","2","3"],2
返回值
[["1","2"],["2","1"]]
class Solution {
public:
/**
* return topK string
* @param strings string字符串vector strings
* @param k int整型 the k
* @return string字符串vector<vector<>>
*/
vector<vector<string> > topKstrings(vector<string>& strings, int k) {
//先用int计数 然后再用to_string把它转换成字符串
map<string, int> mp;
vector<vector<string>> res;
for(const auto &i : strings){
mp[i]++;
}
for(auto it = mp.begin(); it != mp.end(); it++){
res.push_back( {it->first,to_string(it->second)} );
}
/*sort(word.begin(),words.end(),
[](const string &a, const string &b){
return a.size() < b.size();
});*/
sort(res.begin(), res.end(),
[](vector<string> &m, vector<string> &n){
//如果是mp[0]=1;mp[1]=1
if(m[1] == n[1]){
return m[0] < n[0];
} else { //mp[1] = '2' mp[2] = '1' 得把'2'变成 2
return stoi(m[1]) > stoi(n[1]);
}
});
//重新赋大小 不重新赋大小 会多出["3","1"]
res.resize(k);
return res;
}
};