1366. 通过投票对团队排名
题目来源
题目分析
现在有一个特殊的排名系统,依据参赛团队在投票人心中的次序进行排名,每个投票者都需要按从高到低的顺序对参与排名的所有团队进行排位。
排名规则如下:
- 参赛团队的排名次序依照其所获「排位第一」的票的多少决定。如果存在多个团队并列的情况,将继续考虑其「排位第二」的票的数量。以此类推,直到不再存在并列的情况。
- 如果在考虑完所有投票情况后仍然出现并列现象,则根据团队字母的字母顺序进行排名。
给你一个字符串数组
votes代表全体投票者给出的排位情况,请你根据上述排名规则对所有参赛团队进行排名。请你返回能表示按排名系统排序后的所有团队排名的字符串。
题目难度
- 难度:中等
题目标签
- 标签:投票、哈希表
题目限制
1 <= votes.length <= 10001 <= votes[i].length <= 26votes[i].length == votes[j].length对于所有0 <= i, j < votes.lengthvotes[i][j]是一个字母,表示第i个投票者给出第j个团队的排名。- 所有字符都是大写英文字母。
解题思路
思路:计数 + 排序
- 问题定义:
- 根据投票结果对参赛团队进行排名,排名依据是每个团队在各个投票者心中的排名顺序。
- 核心算法:
- 使用一个二维数组
count来记录每个团队在每个位置上获得的票数。 - 遍历投票结果,更新
count数组。 - 将团队按
count数组中的票数进行排序,如果票数相同,则按字母顺序排序。
- 使用一个二维数组
- 关键步骤:
- 初始化
count数组,大小为26 x (m+1),其中m是投票的长度。 - 遍历投票结果,更新
count数组。 - 将投票结果中的团队字符存入数组,并按规则进行排序。
- 构建排序后的结果字符串并返回。
- 初始化
核心算法步骤
- 初始化计数数组:
- 创建一个二维数组
count,大小为26 x (m+1),用于记录每个团队在每个位置上的票数。
- 创建一个二维数组
- 统计票数:
- 遍历
votes数组,对于每个投票,更新count数组。
- 遍历
- 排序团队:
- 将投票结果中的团队字符存入数组
chars。 - 使用自定义比较器对
chars进行排序,首先比较票数,如果票数相同则按字母顺序比较。
- 将投票结果中的团队字符存入数组
- 构建结果字符串:
- 使用
StringBuilder将排序后的字符数组转换为字符串。
- 使用
代码实现
以下是计数和排序方法的 Java 代码实现:
public String rankTeams(String[] votes) {
int m = votes[0].length();
int[][] count = new int[26][m + 1];
for (String vote : votes) {
for (int i = 0; i < m; i++) {
count[vote.charAt(i) - 'A'][i]++;
}
}
Character[] chars = new Character[m];
for (int i = 0; i < m; i++) {
chars[i] = votes[0].charAt(i);
}
Arrays.sort(chars, (o1, o2) -> {
for (int i = 0; i < m; i++) {
if (count[o1 - 'A'][i] != count[o2 - 'A'][i]) {
return count[o2 - 'A'][i] - count[o1 - 'A'][i];
}
}
return o1 - o2;
});
StringBuilder sb = new StringBuilder();
for (Character c : chars) {
sb.append(c);
}
return sb.toString();
}
代码解读
- 统计票数:通过遍历
votes数组,更新count数组来记录每个团队在每个位置上的票数。 - 排序:使用
Arrays.sort方法结合自定义比较器来对团队进行排序

101

被折叠的 条评论
为什么被折叠?



