红包运气排行榜|豆包MarsCode AI刷题

169 阅读3分钟

红包运气排行榜 问题描述:

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