这是今天在一次采访中问我的,被盯着问题5分钟后被踢了出去。
给出一个数组 A ,使得所有奇数位置([ A 1 , A 3 , A 5 ,…])和所有偶数位置的子序列([ A 2 , A 4 , A 6 ,…])均按排序顺序排列-例如[1、7、2、8、3、9、4、10、5]或[3、8、4、11、5]或[5、2、7、4] —对 A 在O( n )时间和O(1)空间(包括堆栈空间和输出数组空间)中。
最近两个小时,我绞尽脑汁,挑了我朋友的脑袋。 Google没有给出任何答案。我不想涂上任何意见,但我觉得在给定的复杂性下这可能无法解决。
我们该如何解决?感谢所有输入。
答案 0 :(得分:1)
如果(1)两个交错的序列在非交错时可以形成一个单调序列,则和(a)数组以最低编号开始并且长度为奇数,或者(b)数组以第二个序列的最小序号(不交织时将在右侧的序列)开始,并且长度相等,我们也许可以逆转A Simple In-Place Algorithm for In-Shuffle (Peiyush Jain, 2008)中描述的算法。
我们必须首先执行“循环前导”序列,然后执行循环移位。
示例1
[1, 7, 2, 8, 3, 9, 4, 10, 5]
1 2 3 4 5 6 7 8 9
1 6 2 7 3 8 4 9 5
|1| unaffected
|1 3 |
m = 4; 2m = 3^2 - 1
cycles start on 3^0, 3^1
(4 swaps with 7 and the other
numbers form a longer cycle.)
示例2(简单):
[1, 5, 2, 7, 3]
1 2 3 4 5
1 4 2 5 3
|1| unaffected
| |
m = 1
cycle in 2m => 2, 5
cycle in 2m => 3, 7
cycle shift by m between 5 and 3
=> 2, 3, 5, 7
我不会期望任何人在不被允许进行研究的情况下接受采访时提出的,但:)