【发布时间】:2020-04-08 03:53:48
【问题描述】:
我正在关注这个挑战:
给出的是数字 m 和 p,它们都可能大到 250000。接下来的 m 行有以下命令之一:
APPEND y,它将y添加到我们列表(队列)的末尾ROTATE,反转列表的最后一个元素 p。如果列表的元素少于 p 个,它会反转列表中的所有元素。我们的工作是在执行完所有命令后打印列表。
蛮力的方法是手动反转数组,这将具有O(pm)的复杂度,但是您需要以O(m)的复杂度来实现它.
我考虑过使用双向链表,我很确定它会起作用,但我无法完成我的答案。
示例
输入
8 3
APPEND 1
APPEND 2
APPEND 3
APPEND 4
ROTATE
APPEND 5
APPEND 6
ROTATE
输出
1 4 3 6 5 2
【问题讨论】:
-
我不太确定谁是“我们”,谁是“你”,以及问题所在。您能否提供一个示例,作为代码或伪代码?
-
嗯,看起来是个不错的挑战。你有什么问题,到目前为止你尝试过什么?
-
用 prev 和 next 两个指针创建一个结构体,指向列表中的下一个或上一个元素(第一个和最后一个元素为 null)。每当调用 append 时,只需创建一个新节点并为它和前一个节点分配指针。我们必须将 K 个数字的节点保留在列表末尾之前,或者如果列表大小已经小于 m,则为第一个节点,例如节点 L 当调用 reverse 时,对于 L 之前的元素,将 next 指针分配给 L+p , 对于 L+1,L+2,....,L+p 更改节点布尔值的状态,以便在 L 向前移动时更改方向。
-
我的意思是每个节点都有一个名为 state 的布尔值,它表示 next 指针是 next 或 prev (取决于该节点是否是必须旋转的数组切片。使用这个,保证算法是从O(m)开始的。我认为它必须工作。但只有一个问题我不能处理:在已经移动L并改变状态时,如果调用另一个ROTATE我们该怎么办?跨度>
-
鉴于引用的问题陈述,这篇文章的标题看起来是一个 XY 问题——除了使用双向链表之外,肯定还有其他方法。如果您采用 p 元素数组,跟踪 head 和 tail,切换 a) 角色和附加方向或 b)"偏移量的符号”,打印即将被覆盖的每个元素(不按字母打印列表之后所有命令,授予)。
标签: algorithm doubly-linked-list