日常编码练习

通过投票对团队排名

题目要求:

解题思路:

思路:以示例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比较大小 的默认规则是:下标从左往右,依次比较对应元素的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值