这是一个面试问题而不是作业.
给定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的数组中
迭代地:
折叠头部阵列,对于每个折叠,前半部分和后半部分头部将被链接.链接后删除headarray的头指针.
继续,直到头部阵列中有一个头部指针.
但是面试官让我把它解决了.任何人都可以帮助解决堆栈中的问题,并指出我的解决方案是否有任何错误.提前致谢.
最佳答案 通过使用堆栈和原始数组可以解决此问题.我不会为您编写解决方案,但我会指出如何解决它.
>按照我们将进一步讨论的规则将数组元素推入堆栈
>之后,将堆栈弹回到从索引0开始的数组中
>重复直到达到最终条件
填写堆栈的规则:
>最初将您的数组视为一个“段”
>将该部分分成两半;上半部分你将以相反的顺序(右 – >左)迭代,第二部分按自然顺序(左 – >右)
>你开始从数组的末尾推进堆栈:
>如果迭代是奇数,则首先推动奇数半部分,
>如果迭代甚至首先从偶数半开始
>重复,并保持段的一半,直到它们只包含一个元素;这是你的停止条件
这有点抽象,所以让我们考虑你的例子:
iter = 1 – > 1234< -5678箭头表示迭代的方向 从最后开始并填满堆栈; inter是奇数,所以从遇到的第一个奇数半开始
5
6
7
8
4 <-notice that the order of pushing the halfs on the stack is shown by the arrows
3
2
1
弹出堆栈:5 6 7 8 4 3 2 1
继续划分半场:
iter = 2< -56-> 78< -43 – > 21;奇数半场563;甚至一半78,21
从最后开始并填满堆栈;国际米兰甚至从第一个偶数半开始
5
6
4
3
8 <-even halfs end, odd halfs start
7
1
2
向后弹出堆栈:5 6 4 3 8 7 1 2
再次划分片段,因为每个新半部分中只有一个元素,箭头仅用于突出显示规则:
iter = 3 – > 5< -6> 4< 3-> 8< -7> 1< -2 它很奇怪,所以首先填充堆栈奇数
6
3
7
2
5
4
8
1
弹出堆栈,你就完成了:63725481
我希望这是有道理的;快乐的编码:)