红包运气排行榜 问题描述:
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
问题思路: 最初的想法:看到问题描述,最先想到的解题的方法就是创建一个类,定义一个Person类(因为有两个要排序的字段),然后类里有名字,金额,字段,然后根据类的comparator方法,进行排序,然后运行代码,发现测试用例过了,但是提交后发现被拦住了,原因在于这个所谓的抢红包抢过的人原来是可以再抢的,然后进行进一步的分析。
进一步的想法:我们可以知道我们排序可以根据他们特有的东西来进行绑定,像他们的名字,他们的索引都是唯一的,但是我们需要的是名字,为什么呢,因为我们要将他们抢到的金额进行累加,将他们累加后的金额进行比较才有意义。 所以我们可以创建一个Map,Map的key为他们的名字,Map的value为Person类
值得一提的是,题目中的金额相同按照先后顺序来排应该是按照最先进行抢的顺序。 具体的代码如下所示:
import java.util.*;
public class Main {
public static List<String> solution(int n, List<String> s, List<Integer> x) {
// 创建一个数据结构来存储每个人的信息
List<Person> people = new ArrayList<>();
//创建一个Map用来表示每个人信息
Map<String, Person> map = new HashMap<>();
for (int i = 0; i < n; i++) {
}
// 填充数据
for (int i = 0; i < n; i++) {
//如果map里的key没有,我们直接创建Perosn,然后向map里面添加数据即可
if (!map.containsKey(s.get(i))) {
map.put(s.get(i), new Person(s.get(i), x.get(i), i));
people.add(new Person(s.get(i), x.get(i), i));
} else {
//如果map里key已经有了,那么我们就将他的金额相加即可
Person person = map.get(s.get(i));
person.setAmount(person.getAmount() + x.get(i));
}
}
//我们只需要map的value来排序即可
List<Person> values = new ArrayList<>(map.values());
// 提取结果
Collections.sort(values, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//如果金额不同,那我们就按金额大小逆序
if (o1.amount != o2.getAmount()) {
return o2.amount - o1.amount;
}
//如果金额相同,那么我们就按索引升序
return o1.index - o2.index;
}
});
List<String> result = new ArrayList<>();
//遍历value,此时的value已经按照我们预想的排序排好了
for (Person person : values) {
//按照题目要求,取出person里的name字段
result.add(person.name);
}
System.out.println(result);
return result;
}
// 定义一个类来存储每个人的信息
static class Person {
String name;
int amount;
int index;
public Person(String name, int amount, int index) {
this.name = name;
this.amount = amount;
this.index = index;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getAmount() {
return this.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")));
}
}