在队列中选择备用位置

时间:2019-03-24 05:16:44

标签: c++ data-structures queue

有些人排长队。选择过程遵循以下规则:选择站立在均匀位置上的人。在所选择的人员中形成队列,并再次从这些仅处于偶数位置的人员中选择人员。这一直持续到我们只剩下一个人为止。找出该人在原始队列中的位置。

如何修改代码,使其在队列中没有奇数个元素的情况下工作,因为在某些时候(在while循环中),队列肯定没有奇数个元素。

let originalDate = "2019-03-22"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let newDate = dateFormatter.string(from:originalDate)!
print(newDate)

输入:5 预期产量:4

2 个答案:

答案 0 :(得分:1)

关键在问题陈述中:在所选人员中,形成队列。当您从q中选择人员时,请勿将其放回同一队列中,而应将它们放到新队列中。完成选择之后,在继续下一次迭代之前,先swap两个队列(用新队列替换旧队列)。

答案 1 :(得分:0)

基本问题似乎是您将所选职位放在队列的末尾,将新队列附加到旧队列。如果新队列的开始与while循环的迭代开始相对应,则此方法有效。但是,当旧队列的长度为奇数时,这将不起作用。

您的方法的下一步是如果长度为奇数,则从旧队列中删除最后一个元素。这样就给您提供了一个均匀长度的队列。新的问题是弄清楚何时找到新队列的开始,以便您可以重复该过程(检查奇数长度)。

执行此操作的一种方法是将前哨值放在队列的开头。因此,在构建初始队列时,请使用数字0n而不是仅1n进行构建。循环要做的第一件事是检查队列的前端是否为零。如果是,则将其弹出,强制其余队列具有均匀的长度,然后在末尾按零。之后,按需进行操作(弹出,弹出,推动)。


一种不太神秘的方法是使用两个队列,而不是模拟两个队列。

一种更快的方法是删除循环并使用公式。 (哪个公式?这是一个合理的数学练习,所以我让您自己弄清楚。尤其是因为原始问题也是一个练习。我只想提一下,数学涉及2的幂。)