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

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

实现的不是特别的优雅


就是手上有一堆牌

先取顶上一张放到桌上

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

以此类推

给了你最后桌上的序列

求你原来手上牌的序列


很快就可以分析出来

先取顶上一张放到桌上

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

可以转化为

“隔一张

放一张到桌上

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


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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-30
  • 2021-08-14
  • 2022-01-31
  • 2022-12-23
  • 2021-05-04
  • 2021-07-17
猜你喜欢
  • 2022-01-17
  • 2021-10-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案