7月算法训练------第二十二天(有序集合)解题报告

7月算法训练------第二十二天(有序集合)解题报告

题目类型:有序集合
题目难度:困难

第一题、1418. 点菜展示表

  1. 题目链接:1418. 点菜展示表
  2. 思路分析:
    运用哈希表;
    哈希表 nameSet 保存所有的餐品名称;
    哈希表 foodsCnt 保存桌号及该桌点餐数量,点餐数量也用一个哈希表保存。
    遍历订单并保存信息后,从nameSet 中提取餐品名称,并按字母顺序排列;从foodsCnt 中提取桌号,并按桌号升序排列。然后将餐品名称和桌号分别填入点菜展示表的第一行和第一列。对于表中的餐品数量,我们逐行填入,对于每一行,我们遍历餐品名称,在foodsCnt 中查找对应的点餐数量,然后填入表格中对应位置。
    从订单中获取餐品名称和桌号,统计每桌点餐数量
    提取餐品名称,并按字母顺序排列
    提取桌号,并按餐桌桌号升序排列
    填写点菜展示表

需要注意的Collections.sort(names);
4. 代码:

class Solution {
    public List<List<String>> displayTable(List<List<String>> orders) {
        Set<String> nameSet = new HashSet<String>();
        Map<Integer, Map<String, Integer>> foodCnt = new HashMap<Integer, Map<String, Integer>>();
        for(List<String> order : orders){
            nameSet.add(order.get(2));
            int id = Integer.parseInt(order.get(1)); // 将字符串转换为整数
            Map<String, Integer> map = foodCnt.getOrDefault(id, new HashMap<String, Integer>());
            map.put(order.get(2), map.getOrDefault(order.get(2), 0) + 1);
            foodCnt.put(id, map);
        }
        int n = nameSet.size();
        List<String> names = new ArrayList<String>();
        for(String name : nameSet){
            names.add(name);
        }
        Collections.sort(names);

        int m = foodCnt.size();
        List<Integer> ids = new ArrayList<Integer>();
        for(int id : foodCnt.keySet()){
            ids.add(id);
        }
        Collections.sort(ids);

        List<List<String>> table = new ArrayList<List<String>>();
        List<String> header = new ArrayList<String>();
        header.add("Table");
        for(String name : names){
            header.add(name);
        }
        table.add(header);
        for(int i = 0; i < m; ++i){
            int id = ids.get(i);
            Map<String, Integer> cnt = foodCnt.get(id);
            List<String> row = new ArrayList<String>();
            row.add(Integer.toString(id));
            for(int j = 0; j < n; ++j){
                row.add(Integer.toString(cnt.getOrDefault(names.get(j), 0)));
            }
            table.add(row);
        }
        return table;
    }
}

剑指offer

第二题、剑指 Offer 05. 替换空格

  1. 题目链接:剑指 Offer 05. 替换空格
  2. 思路分析:
    将字符串转换为字符数组,然后遍历数组,如果是' ',则将其替换为"%20"
  3. 代码:
class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        char[] c = s.toCharArray();
        for(char cc : c){
            if(cc == ' '){
                sb.append('%');
                sb.append('2');
                sb.append('0');
            }else{
                sb.append(cc);
            }
        }
        return sb.toString();
    }
}

第三题、剑指 Offer 58 - II. 左旋转字符串

  1. 题目链接:剑指 Offer 58 - II. 左旋转字符串
  2. 思路分析:
    将字符串转变为字符数组,然后从第n位开始遍历这个数组,将第n位以后的字符都加入到StringBuilder中,然后再将前n位加入到StringBuilder中。
  3. 代码:
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder();
        char[] ch = s.toCharArray();
        for(int i = n; i < ch.length; i++){
            sb.append(ch[i]);
        }
        for(int i = 0; i < n; i++){
            sb.append(ch[i]);
        }
        return sb.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值