字符串出现次数的TopK问题
优先队列+重载小于号+class结构体
对于重载小于号的结构体中,默认a<b,返回1则不交换a,b,返回0,交换 a,b
struct Node{
string s;
int ans;
friend bool operator <(const Node & a,const Node & b)
{
if(a.ans!=b.ans)
{
return a.ans<b.ans;
}
else
{
return a.s>b.s;
}
}
};
class Solution {
public:
vector<vector<string> > solve(vector<string> str,int k)
{
map<string,int> mp;
for(int i=0;i<str.size();i++)
{
mp[str[i]]++;
}
map<string,int>::iterator it=mp.begin();
priority_queue<Node,vector<Node>,less<Node> > q;
for(;it!=mp.end();it++)
{
Node t;
t.s=it->first;
t.ans=it->second;
q.push(t);
}
vector<vector<string> > vec;
for(int i=0;i<k;i++)
{
vector<string> v;
string str1=q.top().s;
int x=q.top().ans;
// cout<<str1<<" "<<x<<endl;
q.pop();
// string str2="";
//
// while(x)
// {
// str2+=char(x%10+'0');
// x/=10;
//
// }
//
// reverse(str2.begin(),str2.end());
//
// cout<<str1<<" "<<str2<<endl;
v.push_back(str1);
v.push_back(to_string(x));
vec.push_back(v);
}
return vec;
}
vector<vector<string> > topKstrings(vector<string>& strings, int k)
{
// write code here
return solve(strings,k);
}
};
make_pair+优先队列
不过这里要记得,自定义的比较默认的是小于号。
struct cmp{
bool operator() (const pair<string ,int> & a,const pair<string,int> & b)
{
if(a.second!=b.second)
{
return a.second<b.second;
}
else
{
return a.first>b.first;
}
}
};
class Solution {
public:
vector<vector<string> > solve(vector<string> str,int k)
{
map<string,int> mp;
for(int i=0;i<str.size();i++)
{
mp[str[i]]++;
}
map<string,int>::iterator it=mp.begin();
priority_queue<pair<string,int>,vector<pair<string,int> >,cmp> q;
for(;it!=mp.end();it++)
{
q.push(make_pair(it->first,it->second));
}
vector<vector<string> > vec;
for(int i=0;i<k;i++)
{
vector<string> v;
string str1=q.top().first;
int x=q.top().second;
// cout<<str1<<" "<<x<<endl;
q.pop();
// string str2="";
//
// while(x)
// {
// str2+=char(x%10+'0');
// x/=10;
//
// }
//
// reverse(str2.begin(),str2.end());
//
// cout<<str1<<" "<<str2<<endl;
v.push_back(str1);
v.push_back(to_string(x));
vec.push_back(v);
}
return vec;
}
vector<vector<string> > topKstrings(vector<string>& strings, int k)
{
return solve(strings,k);
}
};