这是面试的时候碰到的问题
由于当时没有进入算法的状态
实现的不是特别的优雅
就是手上有一堆牌
先取顶上一张放到桌上
再取顶上一张放到这堆牌的底部
以此类推
给了你最后桌上的序列
求你原来手上牌的序列
很快就可以分析出来
“
先取顶上一张放到桌上
再取顶上一张放到这堆牌的底部
”
可以转化为
“隔一张
放一张到桌上
再对剩下的牌做同样的操作”
我当时发现逆序是真TM的难求
所以用一个HashMap存了index
然后对index操作
最后还原
这样不太好
先从正序思考一遍
所以如果我们想逆序
需要从牌的数目
确定我们逆序的情况
比如这里是6
毫无疑问第一轮下来剩下3个
第二轮剩下1个
这样分析就明朗了
只要确定每次操作
牌的数目有几张
就可以快速解决了
数目的话
再类推下
比如11:11、5、2、1
就是n/2
所以我们需要一个数组把每次的操作的牌数存下来
对应这个例子就是
11 5 2 1
那如果我们假设桌上的牌的序列是x1(最后的)到x11
从1还原到2
序列变成了x2 x1
从2还原到5,相差3
序列变成了x5,x2,x4,x1,x3
从5还原到11,相差6
序列变成了x11,x5,x10,x2,x9,x4,x8,x1,x7,x3,x6
看懂了这个分析,问题就迎刃而解了
其实逆序无非就是还原过程
我们一开始感觉逆序难
是因为很难逆推出上一个的数目
但是一旦我们开个数组记录下各个情况下的数目
就很好解决了
这里序列用链表存储最好,增删性能最优
终于搞定啦。。。不管面试如何,能get到这个好题,我就已经心满意足了。。。感谢!