知乎,小米三试题,很粗暴

 

( jiao  @wlcj  zuo  de di  yi  ti )

QUESTION: 

一副牌,序号从1到n,每次从牌堆顶部拿出一张牌放在桌子上,并将下一张牌放到牌堆底,依次循环,最终在桌子上的牌从1到n的有序。设计程序实现。

 

先小范围模拟一下:  

       假设n=6;即6张牌。

      设t是开始的牌堆, s是桌上的牌

      开始 

      t { 1 2 3 4 5 6 }                   s {  }

      这里一步步模拟  

      t { 2 3 4 5 6 }                      s { 1 }

      t { 3 4 5 6 2 }                      s { 1 }

      t { 4 5 6 2 }                         s { 1 3 }

      t { 5 6 2 4 }                         s { 1 3 }

      t { 6 2 4 }                            s { 1 3 5 }

      t { 2 4 6 }                            s { 1 3 5 }

      t { 4 6 }                               s { 1 3 5 2 }

      t { 6 4 }                               s { 1 3 5 2 }

      t { 4 }                                  s { 1 3 5 2 6 }

      t { 4 }                                  s { 1 3 5 2 6 }

      t { }                                     s { 1 3 5 2 6 4 }

即           t { 1 2 3 4 5 6 } -----------------------> s { 1 3 5 2 6 4 }

 

    可以看到

1 ---> s[1]

2 ---> s[4]

3 ---> s[2]

4 ---> s[6]

5 ---> s[3]

6 ---> s[5]

这个数组里的值不管如何变, t->s的映射都是一样的  他们的位置变化都是固定的。

这样就有一个思路可以逆过来想:

假设我们已经知道  

结果数组s的值为             s { 1 2 3 4 5 6 }  (即最后桌面上牌是有序的)

那么  。。根据上面的映射关系

 

那么是否可以推出  t { x x x x x x }  ---> s { 1 2 3 4 5 6 }  呢?

肯定是可以的,来捋一捋这玩意到底该怎么变化。

简单的做法,即将下标和值交换位置就可以了。

t[s[1]] = 1

t[s[2]] = 2

t[s[3]] = 3

t[s[4]] = 4

t[s[5]] = 5

t[s[6]] = 6

ps:注意这个s的值还是上面的 s { 1 3 5 2 6 4 }

即!

t {1 4 2 6 3 5 }        出来了

OJBK

 

 

 

 

 

 

 

 

 

 

 

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值