面试算法题:扑克牌问题,逆过程分析

这是面试的时候碰到的问题

由于当时没有进入算法的状态

实现的不是特别的优雅


就是手上有一堆牌

先取顶上一张放到桌上

再取顶上一张放到这堆牌的底部

以此类推

给了你最后桌上的序列

求你原来手上牌的序列


很快就可以分析出来

先取顶上一张放到桌上

再取顶上一张放到这堆牌的底部

可以转化为

“隔一张

放一张到桌上

再对剩下的牌做同样的操作”


我当时发现逆序是真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到这个好题,我就已经心满意足了。。。感谢!

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/80141012