京东2019年面试题—冲咖啡和洗咖啡杯问题
题目描述:
首先,给你几个数据:
-
数组arr:表示几个咖啡机,这几个咖啡机生产一杯咖啡所需要的时间就是数组中的值,例如arr=[2,3,7]就表示第一台咖啡机生产一杯咖啡需要2单位时间,第二台需要3单位时间,第三台需要7单位时间。
-
int N:表示有N个人需要用咖啡机制作咖啡,每人一杯,同时,假设制作完咖啡后,喝咖啡时间为0,一口闷。
-
int a:表示用洗碗机洗一个咖啡杯需要的时间,串行运行。
-
int b:表示咖啡杯也可以不洗,自然晾干的时间。咖啡杯要么洗,要么晾干。
现在,请你求出这N个人从开始用咖啡杯制作咖啡到杯子洗好或者晾干的最少时间?
分析:题目的意思就是,从第一个人开始冲咖啡计时,到最后一个人喝完咖啡,并把杯子全部洗干净,最少需要多少时间???
整体大致分为两个部分:
- 需要计算出每个人冲好咖啡的时间点。
- 根据每个人冲好咖啡的时间点,开始洗杯子。(因为咖啡是一口喝完的,冲好咖啡的时间点,也就是洗杯子的时间点)
冲咖啡和洗杯子,是两码事,分开讨论即可。
-
冲咖啡
- 采用小根堆的形式,进行组织数据。 准备工作:我们先将所有的咖啡机(arr)以Node节点的形式,放入堆中。Node节点如下:
public class Node { public int requireTime; //冲一个咖啡花费的时间 public int freeTime; //当前咖啡机,在什么时间才是空闲 public Node(int freeTime, int requireTime) { this.requireTime = requireTime; this.freeTime = freeTime; } }如上,Node节点里只有两个参数,
一个是当前咖啡机冲一杯咖啡所花费的时间,另一个就是在什么时间点,当前这台咖啡机才是空闲的状态。堆中组织数据的规则是:将这两个参数加起来,作为参数,来组织成小根堆。-
接下来,就是计算每个人冲好咖啡的时间点,流程如下:因为是小根堆组织的数据,当前堆顶的咖啡机就是最佳的选择。 弹出堆顶的咖啡机,将两个参数(requireTime、freeTime)相加,就是当前这台咖啡机冲好一杯咖啡的时间。并用一个数组,记录好当前数据即可。然后将这两个参数的和作为新Node节点freeTime,requireTime时间不变,再次将当前咖啡机放入小根堆。循环这一步骤,有多少个人,就循环几次即可。
PriorityQueue<Node> minHeap = new PriorityQueue<>((o1, o2) -> o1.freeTime + o1.requireTime - o2.freeTime - o2.requireTime); //将所有咖啡机打包放入堆中 for (int i = 0; i < arr.length; i++) { //刚开始,每台咖啡机都是0点开始 minHeap.add(new Node(0, arr<

本文详细解析了京东2019年面试中的一道算法题,涉及使用小根堆解决咖啡机冲咖啡的优化问题以及动态规划处理咖啡杯洗涤的策略,旨在求出N个人从开始到结束的最短时间。文章通过代码示例解释了如何计算每个人的冲咖啡时间以及如何在机器洗和自然晾干之间选择最优策略,最后提供了递归和动态规划两种解决方案。
最低0.47元/天 解锁文章





