一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手里没有牌.最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组

       研究一下这个面试题特此记录,题目:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手里没有牌.最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组。

第一种:逆推一下。拿一张放手里,然后再拿一张放在上面。这种先不提。

第二种:先将1...n的牌顺序排列,以N为5为例,然后按照题目中描述的步骤重新排列得到[1 3 5 4 2].将得到的牌面上的数字,替换成该数字的索引对应的牌面数字[1 5 2 4 3] (这里索引要从1开始),最终得到的顺序就是题目要求的结果.

说说第二种,很多人不理解为什么数字和角标对调了就是正确答案呢。

其实这里的关键点是:1、另数组的角标从1开始。 2、这样数据是 1、2、3、4、5;角标也是1、2、3、4、5。 那么对调后其实是逆序模仿了执行过程。好吧这么说还是不太好理解 ,那么直接上图。

1、原有数组  ---- > 并按照规则执行

2、如上图我们给执行过规则的扑克堆加上角标(index)。  你会发现 角标不就是 1、 2、3、4、5吗?这和题目上说的执行完桌子上的牌1到N有序一样(这是废话,数据角标必然有序)。那么有意思的来了,我们是执行了最上面的数组得来的这个有序的index 数组。我们带着index来还原一下是不是就OK了呢?好的 ,我把数组切开进行还原,如图:

这时我们只观察红框里的index是不是就是答案了呢,1 5 2 4 3 ->>执行游戏规则 -->> 1 2 3 4 5。

3、其实第二种解题思路中的  数组和角标互换位置就是在带着index还原。即角标变为数字并且存放在数字的位置,例如 2 变为数字,存放在3号位置。细心的同学已经发现 这和第三个数组一致,没错已经实现了还原。因为对换位置之后角标有序,所以数字跟着移动。

好了到这应该说明白了,不明白的多看几次吧。这种算法会满足其他复杂规则。因为执行完规则,我都拿到了最后的结果。顺着角标还原即为正确答案。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值