关于简单序列分组的基本思路

描述:题目是很简单的题目,大家应该都能秒了,只是也许大家都没有认真琢磨过这个简单的算法是怎么通过逻辑推理出来的,我看了网上很多大佬的解释都是直接给结论,这并不利于我们逻辑思维的成长,记忆并不是懂得。不才力求谁看谁明白。

问题:

现有一副扑克牌,需要按顺序轮流发给三个玩家,编写算法。

分析思路:

  1. 首先我们将扑克牌放进一个数组,数组从1开始,每个数字代表一张牌,如下:

        [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ……, 54 ]

  1. 我们截取一个片段来分析它的规律,后再同步到整个数组,如下:

        [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

  1. 假设三名玩家分别为A,B,C,我们可以观察到这样的结果:

  1. 为了更加清晰,我们将他们分别提取出来, A[1, 4, 7, 10]B[2, 5, 8]C[3, 6, 9]
  2. 我们先来看A[1, 4, 7, 10], 因为我们有三个玩家,每一轮都要发出三张牌之后才可以进入下一轮,那么A玩家总是每一轮的第一张牌,也就是每一轮(3张发完)结束后的下一张牌,那么我们可以得到A玩家手牌的规律为[ 1, 3+1, 3+3+1, 3+3+3+1 ], 也就是[ 3 x 0 +1, 3 x 1 +1, 3 x 2 +1, 3 x 3 +1 ], 简化一下可以得到A[ 3n + 1 ]
  3. 同理B[2, 5, 8]的规律为[ 2, 3+2, 3+3+2 ][ 3 x 0 +2, 3 x 1 +2, 3 x 2 +2, 3 x 3 +2 ],简化后得到B[ 3n +2 ]
  4. 那么C[3,3+3,3+3+3][ 3 x 0 +3, 3 x 1 +3, 3 x 2 +3 ],简化得 C[ 3n + 3], 再合并一下得 C[ 3(n + 1) ]
  5. 这个时候我们就得到了A[ 3n + 1 ]B[ 3n +2 ]C[ 3n + 3]/ C[ 3(n + 1) ]。他们三者共有的部分都是 + 3n ,我们把这个共有的部分去掉就能够得到每个玩家独有的特点。在数学里,3n 代表了可以被3整除,而后面多出来的部分就成了除不尽剩下的余数,于是我们就得到了下面的规律:
    1. A = (3n + 1) % 3 = 1
    2. B = (3n + 2) % 3 = 2
    3. C = (3n + 3) % 3 = 0
  6. 那么,一个从1开始的数组,我们就可以这样去分配(注意循环设定从1开始)

  1. 但是计算机里数组的索引都是从0开始的,所以我们反直觉的要将所有的排号往前退一位,也就是余数都减去1,得:
    1. A = (3n + 0) % 3 = 0
    2. B = (3n + 1) % 3 = 1
    3. C = (3n + 2) % 3 = 2
  2. 最后算法得代码就变成了这样:

结论:

要将一个序列按顺序分发给N个组,就除以N取余获得每一个元素所属得分组,在计算机里面分的话,记得第一个位置是0索引,所以余数也得往前退1。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值