通过投票对团队排名
题目要求:
解题思路:
思路:以示例1为例
1、我们需要去遍历该数据结构,同时记录每个字符出现的次数。为此需要定义一张哈希表来建立映射关系。
注:哈希表仅仅起到了两个作用
①:建立映射关系
②:统计数据个数
而哈希表默认的排序是不一定满足最终结果的,因此最终还需要我们重新排序。
通过哈希表,我们可以建立下述映射关系:
字符A、B、C分别对应一个由vector<int> 构成的数据结构,内部用于记录不同名次出现的次数。
2、建立完映射关系后遍历votes数据结构,统计每个字符不同排名出现的次数。
3、将哈希表中的数据拷贝到vector当中,使用sort函数,并自己编写一个比较方法重新排序
注:不要傻傻的将题目中所有提到的点都试图定义一个变量去形容,就比如本题中的排名,数组、vector、string这三类下标本身就是从小到大开始,就能够起到排名这个作用。
实现代码:
struct compare
{
bool operator()(const pair<char,vector<int>>& x1, const pair<char,vector<int>> x2)
{
return x1.second > x2.second || (x1.second == x2.second && x1.first < x2.first);
}
};
string rankTeams(vector<string>& votes) {
int team_count = votes[0].size(); //队伍数量
int voter_count = votes.size(); //投票人数
unordered_map<char,vector<int>> ranking;//哈希表 ranking
for(int i = 0; i < team_count; i++)//建立映射关系
{
ranking[votes[0][i]].resize(team_count,0);//votes[0] 指向"ABC" [i] 是遍历"ABC"中的每个元素,resize()是为其每个元素开辟一个team_count大小的,且初始化为0的vector<int>类型
}
for(auto& str : votes)//统计每个字符各自排名出现的次数
{
for(int i = 0; i < team_count; i++)
{
ranking[str[i]][i]++;//str是string类 str[i]是对应的字符元素,ranking[str[i]]是哈希表中对应字符,第二个[i]是当前排名ranking[str[i]][i]++,就是哈希表中,对应字符的对应排名次数+1;
}
}
vector<pair<char,vector<int>>> result(ranking.begin(),ranking.end());//保存哈希表中的数据
sort(result.begin(),result.end(),compare());//自己编写比较方法,并重新排序
string s;
for(auto w : result)
{
s += w.first;
}
return s;
}
注:在vector类中,operator比较大小 的默认规则是:下标从左往右,依次比较对应元素的大小。