有些人排长队。选择过程遵循以下规则:选择站立在均匀位置上的人。在所选择的人员中形成队列,并再次从这些仅处于偶数位置的人员中选择人员。这一直持续到我们只剩下一个人为止。找出该人在原始队列中的位置。
如何修改代码,使其在队列中没有奇数个元素的情况下工作,因为在某些时候(在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
答案 0 :(得分:1)
关键在问题陈述中:在所选人员中,形成队列。当您从q
中选择人员时,请勿将其放回同一队列中,而应将它们放到新队列中。完成选择之后,在继续下一次迭代之前,先swap
两个队列(用新队列替换旧队列)。
答案 1 :(得分:0)
基本问题似乎是您将所选职位放在队列的末尾,将新队列附加到旧队列。如果新队列的开始与while
循环的迭代开始相对应,则此方法有效。但是,当旧队列的长度为奇数时,这将不起作用。
您的方法的下一步是如果长度为奇数,则从旧队列中删除最后一个元素。这样就给您提供了一个均匀长度的队列。新的问题是弄清楚何时找到新队列的开始,以便您可以重复该过程(检查奇数长度)。
执行此操作的一种方法是将前哨值放在队列的开头。因此,在构建初始队列时,请使用数字0
至n
而不是仅1
至n
进行构建。循环要做的第一件事是检查队列的前端是否为零。如果是,则将其弹出,强制其余队列具有均匀的长度,然后在末尾按零。之后,按需进行操作(弹出,弹出,推动)。
一种不太神秘的方法是使用两个队列,而不是模拟两个队列。
一种更快的方法是删除循环并使用公式。 (哪个公式?这是一个合理的数学练习,所以我让您自己弄清楚。尤其是因为原始问题也是一个练习。我只想提一下,数学涉及2的幂。)