MarsCode 49

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

思路:

  1. 2个map,一个存储用户名和他抢的红包,1个存储他抢的顺序
  2. 使用list根据抢的红包数额对用户名排序
  3. 最后返回排序后的list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值