当前位置: 首页 > news >正文

中通笔试ShowMeBug编程题复盘

第一题

需求:根据示例数据完成如下功能
1. 统计每个用户的订单数量
2. 统计每个用户消费金额
3. 统计订单数量最多的用户
4. 统计消费金额最多的用户
5. 根据用户id统计该用户的订单

Order类

package com.mmg;public class Order {public String userId;public String orderId;public double amount;public Order(String userId, String orderId, double amount) {this.userId = userId;this.orderId = orderId;this.amount = amount;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}@Overridepublic String toString() {return "Order{" +"userId='" + userId + '\'' +", orderId='" + orderId + '\'' +", amount=" + amount +'}';}
}

SimpleTest

package com.mmg;import java.util.*;/*** 需求:* 1. 统计每个用户的订单数量* 2. 统计每个用户消费金额* 3. 统计订单数量最多的用户* 4. 统计消费金额最多的用户* 5. 根据用户id统计该用户的订单*/
public class Test {public static void main(String[] args) {// 示例订单数据List<Order> orders = Arrays.asList(new Order("user1", "order1", 100),new Order("user1", "order2", 200),new Order("user2", "order3", 300),new Order("user3", "order4", 100));// 1. 统计每个用户的订单数量Map<String, Integer> stringIntegerMap = countOrdersByUser(orders);System.out.println(stringIntegerMap);// 2. 统计每个用户消费金额Map<String, Double> stringDoubleMap = sumAmountByUser(orders);System.out.println(stringDoubleMap);// 3. 统计订单数量最多的用户String maxOrderUser = getMaxOrderUser(stringIntegerMap);System.out.println("订单数量最多的用户: " + maxOrderUser);// 4. 统计消费金额最多的用户String maxAmountUser = getMaxAmountUser(stringDoubleMap);System.out.println("消费金额最多的用户: " + maxAmountUser);// 5. 根据用户id统计该用户的订单List<Order> ordersByUserId = getOrdersByUserId(orders, "user1");System.out.println(ordersByUserId);}// 1. 统计每个用户的订单数量public static Map<String, Integer> countOrdersByUser(List<Order> orders) {Map<String, Integer> countMap = new HashMap<>();orders.forEach(order -> {String userId = order.getUserId();countMap.put(userId, countMap.getOrDefault(userId, 0) + 1);});return countMap;}// 2. 统计每个用户消费金额public static Map<String, Double> sumAmountByUser(List<Order> orders) {Map<String, Double> amountMap = new HashMap<>();orders.forEach(order -> {String userId = order.getUserId();double amount = order.getAmount();amountMap.put(userId, amountMap.getOrDefault(userId, 0.00) + amount);});return amountMap;}// 3. 统计订单数量最多的用户public static String getMaxOrderUser(Map<String, Integer> countMap) {String maxUser = null;int maxCount = 0;for (Map.Entry<String, Integer> entry : countMap.entrySet()) {if (entry.getValue() > maxCount) {maxCount = entry.getValue();maxUser = entry.getKey();}}return maxUser;}// 4. 统计消费金额最多的用户public static String getMaxAmountUser(Map<String, Double> amountMap) {String maxUser = null;double maxAmount = 0;for (Map.Entry<String, Double> entry : amountMap.entrySet()) {if (entry.getValue() > maxAmount) {maxAmount = entry.getValue();maxUser = entry.getKey();}}return maxUser;}// 5. 根据用户id统计该用户的订单public static List<Order> getOrdersByUserId(List<Order> orders, String userId) {List<Order> orderList = new ArrayList<>();orders.forEach(order -> {if (userId.equals(order.getUserId())) {orderList.add(order);}});return orderList;}
}

第二题

需求:使用多线程完成以下消费者-生产者案例

package com.mmg;/*** 生产者-消费者案例*/
public class Test02 {public static void main(String[] args) {// 创建容量为10的仓库Test02 warehouse = new Test02(10);// 1. 生产者线程:每次生产3个面包,生产5次Thread producer = new Thread(() -> {try {for (int i = 0; i < 5; i++) {int produceCount = 3;warehouse.produceBread(produceCount);System.out.println("【生产者】生产 " + produceCount + " 个面包,当前库存:" + warehouse.getCurrentStock());Thread.sleep(500); // 模拟生产耗时}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("生产者线程被中断");}}, "生产者线程");// 2. 消费者线程:每次消费2个面包,消费8次Thread consumer = new Thread(() -> {try {for (int i = 0; i < 8; i++) {int consumeCount = 2;warehouse.consumeBread(consumeCount);System.out.println("【消费者】消费 " + consumeCount + " 个面包,当前库存:" + warehouse.getCurrentStock());Thread.sleep(800); // 模拟消费耗时}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("消费者线程被中断");}}, "消费者线程");// 启动线程producer.start();consumer.start();}private final int capacity;    // 仓库容量(final修饰,初始化后不可变)private int currentStock;      // 当前库存(线程共享变量,需同步保护)// 构造方法:初始化仓库容量和初始库存(初始库存为0)public Test02(int capacity) {this.capacity = capacity;this.currentStock = 0;}/*** 生产者方法:生产指定数量的面包* @param count 生产数量(需大于0)* @throws InterruptedException 线程等待被中断时抛出*/public synchronized void produceBread(int count) throws InterruptedException {// 1. 合法性校验:生产数量不能为负数或0if (count <= 0) {throw new IllegalArgumentException("生产数量必须大于0!");}// 2. 等待仓库有足够空间(若当前库存+生产数量 > 容量,需等待)// 用while而非if:防止线程被"虚假唤醒"(唤醒后需重新检查条件)while (currentStock + count > capacity) {System.out.println("【等待生产】当前库存:" + currentStock + ",生产" + count + "个后将超出容量" + capacity + ",等待消费者消费...");this.wait(); // 释放锁,进入等待队列,直到被notifyAll()唤醒}// 3. 执行生产逻辑:更新当前库存currentStock += count;// 4. 唤醒等待的消费者(生产后库存增加,可能有消费者在等库存)this.notifyAll();}/*** 消费者方法:消费指定数量的面包* @param count 消费数量(需大于0)* @throws InterruptedException 线程等待被中断时抛出*/public synchronized void consumeBread(int count) throws InterruptedException {// 1. 合法性校验:消费数量不能为负数或0if (count <= 0) {throw new IllegalArgumentException("消费数量必须大于0!");}// 2. 等待仓库有足够库存(若当前库存 < 消费数量,需等待)while (currentStock < count) {System.out.println("【等待消费】当前库存:" + currentStock + ",不足消费" + count + "个,等待生产者生产...");this.wait(); // 释放锁,进入等待队列,直到被notifyAll()唤醒}// 3. 执行消费逻辑:更新当前库存currentStock -= count;// 4. 唤醒等待的生产者(消费后库存减少,可能有生产者在等空间)this.notifyAll();}// 获取当前库存(同步方法,保证线程读取到最新值)public synchronized int getCurrentStock() {return currentStock;}// 获取仓库剩余空间(同步方法,保证计算基于最新库存)public synchronized int getRemainingSpace() {return capacity - currentStock;}
}


文章转载自:

http://0WaEyEiX.ctsjq.cn
http://xcI2ABPi.ctsjq.cn
http://exhgNI9c.ctsjq.cn
http://9qms2jQV.ctsjq.cn
http://cMQMvZAE.ctsjq.cn
http://aSbg1LTq.ctsjq.cn
http://QNpsjOHh.ctsjq.cn
http://4HkPguYy.ctsjq.cn
http://3ubgFgXZ.ctsjq.cn
http://rmhPbrPP.ctsjq.cn
http://rK0mHaAZ.ctsjq.cn
http://UfVhGrQh.ctsjq.cn
http://AAOUJR0j.ctsjq.cn
http://y3Jf3wni.ctsjq.cn
http://jR9HI0nA.ctsjq.cn
http://AXqDiPUU.ctsjq.cn
http://Z7tsZ3NY.ctsjq.cn
http://9POblAHt.ctsjq.cn
http://4vuoA3xA.ctsjq.cn
http://IGuMvUCh.ctsjq.cn
http://e4xBh02M.ctsjq.cn
http://PqFZCPyU.ctsjq.cn
http://wZNI7cyv.ctsjq.cn
http://WqXh4ZTT.ctsjq.cn
http://k6iU6Jfa.ctsjq.cn
http://EJaatHXf.ctsjq.cn
http://GaZsyB7Z.ctsjq.cn
http://6R5jXw2u.ctsjq.cn
http://wrNW4y7S.ctsjq.cn
http://O0ugfPru.ctsjq.cn
http://www.dtcms.com/a/365237.html

相关文章:

  • Ansible 核心功能:循环、过滤器、判断与错误处理全解析
  • 《苍穹外卖》开发环境搭建_后端环境搭建【简单易懂注释版】
  • PL-YOLOv8:基于YOLOv8的无人机实时电力线检测与植被风险预警框架,实现精准巡检与预警
  • 【Spring Cloud微服务】11.微服务通信演义:从飞鸽传书到5G全息,一部消息中间件的进化史诗
  • Git 别名:用简短命令大幅提升开发效率
  • 无人机报警器8G信号技术解析
  • leetcode110. 平衡二叉树
  • 深入解析Java Spliterator(Stream延迟、并行计算核心)
  • 哪些AI生成PPT的软件或网站支持多平台使用?都支持哪些平台?
  • AI生成PPT工具排名:2025年高效办公新选择
  • 关于MySQL数据库连接超时问题及解决办法
  • AR智慧运维系统介绍
  • vue项目打包后dist部署到Nginx
  • 性能测试-jmeter9-直连数据库
  • 深度学习篇---模型组成部分
  • 财务文档处理优化:基于本地运行的PDF合并解决方案
  • 【51单片机】【protues仿真】基于51单片机压力测量仪系统
  • wpf触发器
  • Dify 从入门到精通(第 73/100 篇):Dify 的高级 RAG 优化(高级篇)
  • 调制端Phase Shift Discriminator(PSD)算法原理
  • 数据结构从青铜到王者第二十话---Map和Set(3)
  • windows安装PostgreSQL 和TimescaleDB
  • 数据结构:顺序栈与链栈的原理、实现及应用
  • 集成 Node.js 模块:文件系统与网络操作
  • 深入理解 Java 集合框架:底层原理与实战应用
  • 数据结构——二叉树+堆
  • .gitignore 文件为什么无效。
  • 开学季,老师如何用阅兵仪式激励学生?
  • PNP具身解读——RSS2025论文加州伯克利RLDG: 通过强化学习实现机器人通才策略提炼。
  • 在DDPM(扩散模型)中,反向过程为什么不能和前向一样一步解决,另外实际公式推导时反向过程每一步都能得到一个预测值,为什么还要一步一步的推导?