【发布时间】:2015-10-18 13:13:38
【问题描述】:
这是一道面试题,不是作业。
给定一个 1 到 2 ^N 的数组。例如:1 2 3 4 5 6 7 8 (2^3) 。想象一下这个数组写在一张纸上,我们需要把它对折,这样左半边就会被镜像,然后像右半边一样移动到下面这个
1 2 3 4 5 6 7 8
left | right
half | half
变成
5 6 7 8
4 3 2 1
下一个折叠我们取右一半,镜像它并将其移动到左半边下方,
5 6
4 3
8 7
1 2
纸张必须折叠,每次改变方向(左对右),直到我们将所有元素都放在单列中
6
3
7
2
5
4
8
1
我的解决方案, 第一步 : 为原始数组的后半部分创建一个链表,并将前半部分反转并与头指针连接,
5 6 7 8
| | | |
4 3 2 1
并将链表的头指针存储在一个名为headarray的数组中
迭代:
折叠头部数组,对于每个折叠,前半部分和后半部分标题将被链接。链接后从头数组中删除头指针。
继续直到 w 在头数组中有一个头指针。
但面试官让我用堆栈解决它。任何人都可以帮助解决这个问题,并指出我的解决方案是否有任何错误。提前致谢。
【问题讨论】:
-
在第一步中,您将后半部分移到开头,然后将前半部分反转。在第二步中,前半部分 (5, 6) 保持原位,而不是推动后半部分的前面。在第三次迭代中,后半部分 (6) 再次移到前面。
-
在这种情况下堆栈是什么意思?是 push/pop 结构,还是 CPU 堆栈(无动态分配)?
-
push/pop 结构很可能
-
你说想象数组是写在纸上的,但是如果你折叠一张纸,你不会在第二次折叠时得到那个顺序。 1 会在 8 之上,2 会在 7 之上。你有没有搞错问题?
-
@DouglasZare,我已对其进行了编辑以尝试更清楚地解释它。我有理由确定我已经理解 OP 的初衷。在每次迭代中,方向(左对右)都会发生变化,这是我一开始没有注意到的,但在原文中。
标签: c++ arrays algorithm pointers data-structures