题目

image-20241229120407625

思路

根据示例1,我们遍历votes,统计得到:

  • A:下标0出现5次,下标1出现0次,下标2出现0次
  • B:下标0出现0次,下标1出现2次,下标3出现3次
  • C:下标0出现0次,下标1出现3次,下标2出现2次

将以上的数据添加到一个哈希表(或数组)中,得到记录如下:

1
2
3
'A' : [5, 0, 0]
'B' : [0, 2, 3]
'C' : [0, 3, 2]

将A,B,C排序:

  1. 按照字母出现次数的列表,字典序大的排在前面
  2. 根据字母的ASCII值,小的排在前面

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public String rankTeams(String[] votes) {
int m = votes[0].length();
int[][] cnts = new int[26][m];
for (String vote : votes) {
for (int i = 0; i < m; i++) {
cnts[vote.charAt(i) - 'A'][i]++;
}
}

return votes[0].chars()
.mapToObj(c -> (char) c)
.sorted((a, b) -> {
int[] cntA = cnts[a - 'A'];
int[] cntB = cnts[b - 'A'];
for (int i = 0; i < cntA.length; i++) {
if (cntA[i] != cntB[i]) {
return cntB[i] - cntA[i];
}
}
return a -b;
})
.map(String::valueOf)
.collect(Collectors.joining());
}
}

解析

  • votes[0].chars()被用来获取第一个投票字符串中的每个字符的ASCII值,并将其转换为一个IntStream
  • map.ToObj(c -> (char)c)可以将一个IntStream转换成Stream<Character>,这样就可以在流中对字符进行排序操作
  • sorted 方法是 Stream 接口中的一个中间操作,它接受一个比较器(Comparator),用于定义元素之间的排序规则
  • map 方法是 Stream 接口中的一个中间操作,它接受一个函数作为参数,将流中的每个元素映射到另一个元素
  • Collectors.joining() 是一个静态方法,它创建了一个 Collector 对象,用于将字符串流中的所有字符串连接成一个单一的字符串