上海建站网络公司头条号权重查询
20250222
- 49 红包运气排行榜
- java使用list实现
- java使用Map+List实现
49 红包运气排行榜
java使用list实现
import java.util.*;public class Main {public static List<String> solution(int n, List<String> s, List<Integer> x) {// 创建一个列表来存储参与者的信息List<Pair> participants = new ArrayList<>();// 将参与者的名字和金额存储到列表中for (int i = 0; i < n; i++) {participants.add(new Pair(s.get(i), x.get(i)));}// 对参与者列表进行排序Collections.sort(participants, new Comparator<Pair>() {@Overridepublic int compare(Pair p1, Pair p2) {// 先按金额降序排序if (p1.amount != p2.amount) {return p2.amount - p1.amount;}// 如果金额相同,保持原来的顺序return 0; // 这里需要保持原来的顺序}});// 提取排序后的名字列表List<String> result = new ArrayList<>();for (Pair p : participants) {result.add(p.name);}return result;}// 定义一个简单的 Pair 类来存储名字和金额static class Pair {String name;int amount;Pair(String name, int amount) {this.name = name;this.amount = amount;}}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")));}
}
发现报错:
原因在于:用户可以强多次,最后他抢到的金额需要累计,所以不能简单的使用list实现
java使用Map+List实现
import java.util.*;public class Solution {public static List<String> solution(int n, List<String> s, List<Integer> x) {assert n == s.size() && n == x.size();Map<String, Integer> start = new HashMap<>();Map<String, Integer> cnt = new HashMap<>();for (int i = 0; i < n; i++) {String key = s.get(i);if (!start.containsKey(key)) {start.put(key, i);}cnt.put(key, cnt.getOrDefault(key, 0) + x.get(i));}// 创建一个列表,用于存储cnt中的键,以便进行排序List<String> keys = new ArrayList<>(cnt.keySet());// 根据cnt的值降序和在s中首次出现的位置升序进行排序Collections.sort(keys, (a, b) -> {int cmp = cnt.get(b).compareTo(cnt.get(a)); // 按cnt降序if (cmp == 0) {return Integer.compare(start.get(a), start.get(b)); // 如果cnt相同,则按首次出现位置升序}return cmp;});return keys;}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")));}
}
思路:
- 2个map,一个存储用户名和他抢的红包,1个存储他抢的顺序
- 使用list根据抢的红包数额对用户名排序
- 最后返回排序后的list