刷题笔记:红包运气排行榜

58 阅读2分钟

原题: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));
}

为什么使用 LinkedHashMapLinkedHashMap 会按照插入的顺序保存键值对

大致思路

拿这个举例:

这是原来的顺序(已处理 s 重复条件)

indexmap.keymap.value
0"a"1
1"b"2
2"c"2
3"d"1

数据结构

  1. 使用 List,存放 map 的键(key),以及其自身有一个下标
List<String> keys = new ArrayList<>(map.keySet());

即:

indexkey
0"a"
1"b"
2"c"
3"d"
  1. 自定义 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);
}

即:

valueindex
10
21
22
13

排序

Pair 中,根据值(value)进行降序排序:

Collections.sort(valuesPair, (p1, p2) -> {
    return p2.value - p1.value;
});

排序结果即:

valueindex
21
22
10
13

取得结果

定义一个 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));
}

image.png

完整代码


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")));
    }
}

image.png