MarsCode 49
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>() {
@Override
public 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