作为最近的一份工作申请的一部分,我被要求编写一个解决这个问题的代码。
鉴于,
- n = 围成一圈的人数。
- k = 每次计数的人数
每个人都有一个唯一的(递增的)id。从第一个人(最低 id)开始,他们从 1 开始数到 k。
然后,k 处的人被移除,圆圈闭合。下一个剩余的人(在被淘汰的人之后)从 1 开始重新计数。这个过程重复进行,直到只剩下一个人,即获胜者。
解决方案必须提供:
- 每个人的 ID,按照他们从圈子中移除的顺序排列
- 获胜者的 id。
性能限制:
- 使用尽可能少的内存。
- 使解决方案尽可能快地运行。
我记得几年前在我的 CS 课程中做过类似的事情,但在这次测试时无法回忆起细节。我现在意识到这是一个众所周知的经典问题,有多种解决方案。(我不会提到它的名字,因为有些人可能只是“维基百科”一个答案)。
我已经提交了我的解决方案,所以我绝对不会找人来为我回答。一旦/如果其他人提供了一些答案,我将稍后提供。
我提出这个问题的主要目的是看看我的解决方案与其他解决方案的要求和限制相比如何。
(请仔细注意要求,因为我认为它们可能会使某些“经典”解决方案无效。)