第185场周赛题目整理

做过的题再遇到还是想不起来,还是勤劳一点,多做笔记把

  1. 重新格式化字符串

比赛时候完全用字符串拼接,写了很长时间。赛后看大佬们讨论,才想到用栈保存

这个就是先把数字保存一个栈,然后字母保存一个栈,然后看他么的差是否大于1.之后一人一下的往里面放。

class Solution {
    public String reformat(String s) {
        Stack<Character> stack1 = new Stack();
        Stack<Character> stack2 = new Stack();
        String str="";
        for(char c : s.toCharArray()){
            if(c >= '0' && c <= '9')stack1.add(c);
            else stack2.add(c);
        }
        if (Math.abs(stack1.size() - stack2.size()) > 1) return str;
        Stack<Character> temp = new Stack();
        if (stack2.size()> stack1.size()) {
            temp = stack2;
            stack2 = stack1;
            stack1 = temp;
        }
        while(!stack1.empty() || !stack2.empty()){
            str+=String.valueOf(stack1.size()>stack2.size()?stack1.pop():stack2.pop());
        }
        return str;
    }

}
  1. 点菜展示表

平时刷题很少用到TreeMap,赛后学习到了。

class Solution {
     public List<List<String>> displayTable(List<List<String>> orders) {
        // 菜单foodSet
        TreeSet<String> foodSet = new TreeSet<>();

        // 订单集合 <餐桌号,<食品名称,食品数量>>
        TreeMap<String, TreeMap<String, Integer>> orderMap = new TreeMap<>(Comparator.comparingInt(Integer::parseInt));

        //1 遍历订单,填入相关信息
        for (List orderList : orders) {
            //1.1 获得餐桌号
            String tableNumber = (String) orderList.get(1);
            //1.2 获得食品名称
            String foodName = (String) orderList.get(2);
            //1.3 食品set里面加入食品名称
            foodSet.add(foodName);

               //1.4.1 如果不存在xx桌的订单,就创建一条订单map
            if (!orderMap.containsKey(tableNumber)) {
                // xx食品map
                TreeMap<String, Integer> food = new TreeMap<>();
                food.put(foodName, 1);
                // 将xx桌订单添加到所有订单map中
                orderMap.put(tableNumber, food);
            } else {
                // 1.4.2 如果xx桌子订单存在
                TreeMap<String, Integer> foodMap = orderMap.get(tableNumber);
                // 如果xx桌子订单中不存在xx事物,就加入
                if (!foodMap.containsKey(foodName)) {
                    // 将食物map添加到已存在的桌子订单中
                    foodMap.put(foodName, 1);
                } else {
                    // 如果已经存在xx事物,就将数量加1
                    foodMap.put(foodName, foodMap.get(foodName) + 1);
                }
            }
        }
        //2、将订单map写到结果集中
        List<List<String>> result = new ArrayList<>();
        // 2.1 添加第一行标题、
        ArrayList<String> title = new ArrayList<>();
        title.add("Table");
        for (String s : foodSet) {
            title.add(s);
        }
        result.add(title);

        //2.2 遍历订单map,将信息写到结果结合
        Set<String> tables = orderMap.keySet();

        for (String tableN : tables) {
            // 根据桌号获取 食品清单
            Map foods = orderMap.get(tableN);
            // 创建一条xx桌订单list
            ArrayList<String> list = new ArrayList<>();
            // 加入桌号
            list.add(tableN);
            // 遍历foodSet,根据foodSet中的食物名称来查foods,存在就返回数量。不存在就返回0
            for (String name : foodSet) {
                // 如果存在xx事物
                if (foods.containsKey(name)) {
                    String foodNum = String.valueOf(foods.get(name));
                    list.add(foodNum);
                } else {
                    // 如果没有预定xx事务,就将订单上写0
                    list.add("0");
                }
            }
            result.add(list);
        }

        return result;
    }
}

这道题是真的麻烦,所以引用题解区一位大佬详细的注释题解。

  1. 数青蛙

思路。
统计青蛙叫的过程,这里可以只统计c或者统计所有字母。
出现一次c就累加一次,遇到k就减一次
然后取其中出现最大的

第二个问题
就是如何判断有效性,
首先 上来可以判断下是否是5的倍数,
其次 后面出现字母的次数一定小于前面出现
比如 croaak 在遇到第二个a的时候,o才只有一个 a却能出现两个,所以就可以直接返回-1。

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        char[] chars = croakOfFrogs.toCharArray();
        if (chars.length % 5 != 0) {
            return -1;
        }
        Map<Character, Integer> map = new HashMap<>();
        map.put('c', 0);
        map.put('r', 1);
        map.put('o', 2);
        map.put('a', 3);
        map.put('k', 4);
        int[] counts = new int[5];
        int result = 0;
        for (char c : chars) {
            int idx = map.get(c);
            ++counts[idx];
            result = Math.max(result, counts[idx]);
            if(idx>0 && counts[idx-1] < counts[idx])
                return -1;
            if (idx == 4) {
                for (int i = 0; i < 5; ++i) {
                    --counts[i];
                }
            }
        }
        return result;
    }
}
  1. 生成数组

太难了 题解也看不懂。我先学习学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值