1366 通过投票对团队排名(java8语法将map转为对list进行排序)

1. 问题描述:

现在有一个特殊的排名系统,依据参赛团队在投票人心中的次序进行排名,每个投票者都需要按从高到低的顺序对参与排名的所有团队进行排位。

排名规则如下:

参赛团队的排名次序依照其所获「排位第一」的票的多少决定。如果存在多个团队并列的情况,将继续考虑其「排位第二」的票的数量。以此类推,直到不再存在并列的情况。
如果在考虑完所有投票情况后仍然出现并列现象,则根据团队字母的字母顺序进行排名。
给你一个字符串数组 votes 代表全体投票者给出的排位情况,请你根据上述排名规则对所有参赛团队进行排名。

请你返回能表示按排名系统 排序后 的所有团队排名的字符串。

示例 1:

输入:votes = ["ABC","ACB","ABC","ACB","ACB"]
输出:"ACB"
解释:A 队获得五票「排位第一」,没有其他队获得「排位第一」,所以 A 队排名第一。
B 队获得两票「排位第二」,三票「排位第三」。
C 队获得三票「排位第二」,两票「排位第三」。
由于 C 队「排位第二」的票数较多,所以 C 队排第二,B 队排第三。
示例 2:

输入:votes = ["WXYZ","XYZW"]
输出:"XWYZ"
解释:X 队在并列僵局打破后成为排名第一的团队。X 队和 W 队的「排位第一」票数一样,但是 X 队有一票「排位第二」,而 W 没有获得「排位第二」。 
示例 3:

输入:votes = ["ZMNAGUEDSJYLBOPHRQICWFXTVK"]
输出:"ZMNAGUEDSJYLBOPHRQICWFXTVK"
解释:只有一个投票者,所以排名完全按照他的意愿。
示例 4:

输入:votes = ["BCA","CAB","CBA","ABC","ACB","BAC"]
输出:"ABC"
解释: 
A 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
B 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
C 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
完全并列,所以我们需要按照字母升序排名。
示例 5:

输入:votes = ["M","M","M","M"]
输出:"M"
解释:只有 M 队参赛,所以它排名第一。

提示:

1 <= votes.length <= 1000
1 <= votes[i].length <= 26
votes[i].length == votes[j].length for 0 <= i, j < votes.length
votes[i][j] 是英文 大写 字母
votes[i] 中的所有字母都是唯一的
votes[0] 中出现的所有字母 同样也 出现在 votes[j] 中,其中 1 <= j < votes.length

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rank-teams-by-votes

2. 思路分析:

① 一开始有思路但是感觉处理起来很麻烦,于是看了领扣的题解,其中一个大佬的解法是先使用一个map<Character, int[]>来计算出当前字符在26个位置上出现的次数,统计好了字符出现的次数之后,将map转为list,这个是因为很难对map进行排序,但是我们可以很方便地对list进行排序,所以将map转为list的话排序就很方便了

② 可以使用java8中的Lambda语法对list中的某个属性进行排序,最后排序好了就可以使用stream方法抽取出list中的属性拼接成字符串进行返回,其中使用到了java语法中的用法是很值得我们学习的,以后可能遇得到,下面是关于代码中使用到的java8语法的资料查询:

https://www.jianshu.com/p/ce41bb35a20a

https://blog.csdn.net/weixin_45531950/article/details/99664197

https://blog.csdn.net/liujun03/article/details/80701999

大佬的题解:https://leetcode-cn.com/problems/rank-teams-by-votes/solution/javapai-xu-jiu-hao-by-soap88/

3. 代码如下:

class Solution {
    public String rankTeams(String[] votes) {
    //key是参赛团队,value是该团队每个排位获得的票数
    Map<Character, int[]> teamRankMap = new HashMap<>();
    for (String vote : votes) {
        for (int i = 0; i < vote.length(); i++) {
            int[] rankArr = teamRankMap.getOrDefault(vote.charAt(i), new int[26]);
            rankArr[i]++;
            teamRankMap.put(vote.charAt(i), rankArr);
        }
    }
    List<Map.Entry<Character, int[]>> teamRankList = new ArrayList<>(teamRankMap.entrySet());
    Collections.sort(teamRankList, (team1, team2) -> {
        int[] ranks1 = team1.getValue();
        int[] ranks2 = team2.getValue();
        //根据投票排序
        for (int i = 0; i < 26; i++) {
            if (ranks1[i] != ranks2[i]) {
                return ranks2[i] - ranks1[i];
            }
        }
        //字母顺序排序
        return team1.getKey() - team2.getKey();
    });

    //转换为字符串输出
    return teamRankList.stream().map(entry -> String.valueOf(entry.getKey())).collect(Collectors.joining());
}
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值