说是题目可以用不同的语言,但是貌似 Java 是多线程的,用 Java 写肯定容易不少。
但,觉得这个题目用多线程简直是有点脱了裤子放屁。
完整题目内容
题目的网站内容如下:
Please complete the following challenge in one of the following programming languages: C, C++, C#, Java, Python, Go, or Typescript. Please only use standard or ubiquitous libraries. If you heavily rely on a library, please include a description on how that library call works with as much detail as possible.
Busy Body Bank services many in-person customers every day in their large luxurious lobby at the center of a city. They have N Tellers in stalls at any time to accommodate heavy traffic while optimizing for employee hours whenever possible. N changes from day-to-day as the bank’s management anticipates surges or reductions of Customer count.
When the bank is empty, tellers are asleep. When a Customer enters, they announce themselves and a teller wakes up and conducts a transaction that takes some amount of time. As more customers arrive, they wake Tellers and conduct a transaction or wait in the bank’s queue for a teller to become available (if there are none immediately available). The bank’s queue line has M possible positions where Customers can wait for tellers to become available. If a Customer walks into the bank to find no available tellers and a full queue, they will take their business to Small and Simple, a bank across the street.
If the bank gets more customers than it expects on any day, then it will call more Tellers in to accommodate this surge, but calling Tellers on-demand usually costs the bank more money than the lost business from under-staffing. The bank would only call in additional Tellers after a day starts if there was a very significant number of customers taking their business elsewhere.
Write a program that simulates a work day for the bank that models the behavior of each actor in this scenario: Teller and Customer. It might be necessary to simulate other actors to match the above scenario. Each actor should be a separate thread. The program will not be run, but should be clear enough to follow to ensure it would run without error. You may choose to provide an example output of the program running. If you do, assume the bank has only slightly underestimated the number of customers that would come in.
With the introduction of different forms of banking (online and ATMs) and an upcoming city festival bringing in countless possible customers, the bank’s analysts say that the customer count forecast has been thrown into disarray. For the below questions, feel free to choose values or value ranges for any undefined variables as you see fit. They may be answered in pseudo-code.
Write an algorithm that the bank can use to optimize the Number of Tellers (N) to call in if they expect C customers for any given day.
Write an algorithm that the bank can use to determine if they should call in or send home Tellers to minimize operation costs.
题目大意
如果没有理解错的话,就是希望实现一个类似银行的处理系统。
这个系统有固定的营业员,同时还有一个缓冲池。
当自己银行柜员不够用的时候,我们可以让客户到别的银行去办理业务,我们也可以从其他银行去调柜员来处理业务。
希望用一个程序的方式对上面的情况进行表述,并且还希望判断当用户数量等于多少的时候,我们希望多银行配备多少柜员。
当用户为多少的时候,我们可以把柜员发回家休息。
解读
如果非要实现的话,使用线程和线程池的概念是比较好实现的。
在开始的时候,默认允许创建 3 个线程,如果还创建线程请求的话,就把这个请求放到线程池里面,等待已经创建的线程完成。
如果线程池都已经满了,那么就需要创建其他的银行线程,把请求的线程放到其他银行里面去执行。
程序里面只有 Java 线程概率用得比较多,Python 的线程是假的多线程,通常没有线程使用的创建,等待,这些概念。
TypeScript 是单线程语言,这真不知道怎么去实现多线程了。
其实我最开始考虑的是使用 List,在一个 List 里面定义一个空间,这个表示的是初始化创建的柜员,在另外一个 List 里面定义空间,这个空间就是缓存了。
当数据开始调用的时候,首先先把第一个 List 进行填充,在定义的对象的时候还需要定义一个时间,我们还知道柜员在处理一个业务需要多少时间。
当第一个 List 填充满了以后,再填充换成 List,当柜员的时间完成后,把第一个 List 中的对象设值为空,然后从缓存 List 里面拿数据这样一种方式。
同时计算总共需要的耗时时间,这样才能确定当前的用户量的时候,需要多少时间才能完成,同时有多少柜员是工作的,有多少柜员是休息的。
但是,题目说要用多线程,所以感觉就是纯粹在多此一举。
另,我们认为这个题目设计得其实非常糟糕。
因为是太多的开放条件和可能性了。 这个在程序设计中是非常难设计的,因为每个可能性都有条件。
比如说下面的:
- 每个柜员的处理时间是不是一样的,如果不一样我们应该如何定义?
- 每个 List 的初始值应该是多少,队列是可以随时调整的还是固定好的。
- 当我们要求其他银行进行帮助的时候,是在 Q 满了的时候,还是在 Q 满了再等多长时间在进行调用。
- 对其他银行的调用初始值是多少,是一次调用一个还是根据客户情况调用多个?
还有其他的很多条件都没有说明白,所以我们觉得这个题目非常糟糕,不确定的地方太多,完全考察不了人的数据设计能力。
同时又要求使用线程,线程的开销其实也是比较大的,也没有必要去做。
所以这个题目非常不好做,感觉有点乱,他们自己都不知道要设计一个什么东西。
总结
不管怎么样还是 OA 的结果上传下吧。
但在提交的文档中,我也明确的说明了这个题目有很多种做法,其实并不是非常理想。
然后,还用手给大致画了一个用 List 列表解决的方案。
不管题目怎么样,但我感觉能基本上提供一个解决方案就好了。
针对程序的实现,我们也提供了程序的实现。
上面是程序的输出,大致表示了线程的调用情况。
感觉这个面试题实在是有点搞不明白,更是有点奇葩。
美东一公司的郁闷面试题 - 求职路上 - iSharkFly