原题:www.marscode.cn/practice/9e…
类型:数据结构(集合)
语言:Java
s 相同(重复)
使用 Map 处理重复的情况:
Map<String, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < n; i++) {
map.put(s.get(i), map.getOrDefault(s.get(i), 0) + x.get(i));
}
为什么使用 LinkedHashMap:
LinkedHashMap 会按照插入的顺序保存键值对
大致思路
拿这个举例:
这是原来的顺序(已处理 s 重复条件)
| index | map.key | map.value |
|---|---|---|
| 0 | "a" | 1 |
| 1 | "b" | 2 |
| 2 | "c" | 2 |
| 3 | "d" | 1 |
数据结构
- 使用
List,存放map的键(key),以及其自身有一个下标
List<String> keys = new ArrayList<>(map.keySet());
即:
| index | key |
|---|---|
| 0 | "a" |
| 1 | "b" |
| 2 | "c" |
| 3 | "d" |
- 自定义
Pair数据结构,存放map的值(value)和下标(顺序)
class Pair {
public Integer value;
public Integer index;
public Pair(Integer value, Integer index) {
this.value = value;
this.index = index;
}
}
List<Pair> valuesPair = new ArrayList<>();
Collection<Integer> values = map.values();
Object[] array = values.toArray();
for(int i = 0; i < values.size(); i++) {
Pair integerIntegerPair = new Pair((Integer) array[i], i);
valuesPair.add(integerIntegerPair);
}
即:
| value | index |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 2 | 2 |
| 1 | 3 |
排序
在 Pair 中,根据值(value)进行降序排序:
Collections.sort(valuesPair, (p1, p2) -> {
return p2.value - p1.value;
});
排序结果即:
| value | index |
|---|---|
| 2 | 1 |
| 2 | 2 |
| 1 | 0 |
| 1 | 3 |
取得结果
定义一个 List,存放结果:
List<String> result = new ArrayList<>();
存放顺序:根据 valuesPair中的 index,逐个添加到 result 中
for(int i = 0; i < map.size(); i++) {
result.add(keys.get(valuesPair.get(i).index));
}
完整代码
import java.util.*;
class Pair {
public Integer value;
public Integer index;
public Pair(Integer value, Integer index) {
this.value = value;
this.index = index;
}
}
public class Main {
public static List<String> solution(int n, List<String> s, List<Integer> x) {
Map<String, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < n; i++) {
map.put(s.get(i), map.getOrDefault(s.get(i), 0) + x.get(i));
}
List<String> keys = new ArrayList<>(map.keySet());
List<Pair> valuesPair = new ArrayList<>();
Collection<Integer> values = map.values();
Object[] array = values.toArray();
for(int i = 0; i < values.size(); i++) {
Pair integerIntegerPair = new Pair((Integer) array[i], i);
valuesPair.add(integerIntegerPair);
}
Collections.sort(valuesPair, (p1, p2) -> {
return p2.value - p1.value;
});
List<String> result = new ArrayList<>();
for(int i = 0; i < map.size(); i++) {
result.add(keys.get(valuesPair.get(i).index));
}
return result;
}
public static void main(String[] args) {
System.out.println(solution(4, Arrays.asList("a", "b", "c", "d"), Arrays.asList(1, 2, 2, 1)).equals(Arrays.asList("b", "c", "a", "d")));
System.out.println(solution(3, Arrays.asList("x", "y", "z"), Arrays.asList(100, 200, 200)).equals(Arrays.asList("y", "z", "x")));
System.out.println(solution(5, Arrays.asList("m", "n", "o", "p", "q"), Arrays.asList(50, 50, 30, 30, 20)).equals(Arrays.asList("m", "n", "o", "p", "q")));
// System.out.println(solution(12, Arrays.asList("aa", "aaaaaaa", "aaaa", "aaaa", "aaaa", "aaaaaaaaaa", "aaaaaaaaa",
// "aaaa", "aaaaaaaaaa", "aaaaaaaaa", "aaaaa", "aaaa"), Arrays.asList(17, 14, 11, 2, 8, 16, 14, 17, 10, 6, 5, 12)).
// equals(Arrays.asList("aaaa", "aaaaaaaaaa", "aaaaaaaaa", "aa", "aaaaaaa", "aaaaa")));
}
}