c – 将数组折叠成单个元素

这是一个面试问题而不是作业.

给定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

我希望这是有道理的;快乐的编码:)

点赞