首页 > 其他分享 >关于简单序列分组的基本思路

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

时间:2024-03-23 18:32:15浏览次数:14  
标签:10 玩家 分组 3n 数组 序列 余数 基本思路 我们

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

问题:

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

分析思路:

  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 +1, 3 x 1 +1, 3 x 2 +1, 3 x 3 +1 ],简化后得到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。

标签:10,玩家,分组,3n,数组,序列,余数,基本思路,我们
From: https://blog.csdn.net/sinat_39215814/article/details/136972247

相关文章

  • Collections工具类,可以使用collections工具类对代码中的list进行分组
    /***根据活动id进行分组*key活动id*value活动id对应的商品id*/Map<Long,Set<Long>>collect=activitySkuList.stream().collect(Collectors.groupingBy(ActivitySku::getActivityId......
  • 【LeetCode 1220】统计元音字母序列的数目
    题目描述原题链接:LeetCode.1220统计元音字母序列的数目解题思路定义DP数组dp[i][j]含义为长度为i+1且以j字符结尾的字符串有多少个,j从0到4依次代表('a','e','i','o','u')这5个元音字符,dp[0][0~4]长度为1时的初始个数都为1;dp[i][j]对应字符串末尾字符已经由j确定,对应......
  • 代码随想录算法训练营day31 | leetcode 455. 分发饼干、376. 摆动序列、53. 最大子数
    目录贪心理论基础核心:题目链接:455.分发饼干-简单题目链接:376.摆动序列-中等题目链接:53.最大子数组和-中等贪心理论基础核心:由局部推全局最优题目链接:455.分发饼干-简单题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每......
  • 力扣HOT100 - 49. 字母异位词分组
    解题思路:排序注意:返回时不能用List,因为List是抽象类,return的必须是List的具体实现,如ArrayListclassSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(Stringstr......
  • BurstAttention:可对非常长的序列进行高效的分布式注意力计算
    提高llm中注意力机制效率的努力主要集中在两种方法上:优化单设备计算和存储能力,如FlashAttention,以及利用多设备的分布式系统,如RingAttention。FlashAttention通过使用静态随机存储器(SRAM)来存储中间状态,而不是依赖于高带宽存储器(HBM)来提高注意力计算速度。而RingAttention通......
  • Python常用模块(random随机模块&json序列化模块)
    1.random随机模块返回两数之间的随机数,不包括尾数:random.randrange()importrandomprint(random.randrange(1,10))#3返回两数之间的随机数,包括尾数:random.randint()importrandomprint(random.randint(1,10))#返回1-10之间的一个随机数,包括10#7随机选取0到100间......
  • 递归法求解最大连续子序列和MaxSubSum
    何为递归呢总结一句话就是:向基准情形不断推进核心就在于“递”和“归”递:不断推进归:向基准情形结合今天的例子进一步解释如下:分而治之的思想divideandconquer分三步:“分”“治”“合并”“分”:将子序列看作三种,左半部分右半部分跨越中间元素的子序列“治”......
  • R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31630最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。普通的模型对于两个序列的波动分析一般是静态的,但是dcc-garch模型可以实现他们之间动态相关的波动分析,即序列间波动并非为一个常数,而是一个随着时间的变化而变化的系数。其......
  • 代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列
    目录392.判断子序列115.不同的子序列392.判断子序列力扣题目链接(opensnewwindow)给定字符串s和t,判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而......
  • 算法打卡day25|回溯法篇05|Leetcode 491.递增子序列、46.全排列、47.全排列 II
     算法题Leetcode491.递增子序列题目链接:491.递增子序列大佬视频讲解:递增子序列视频讲解 个人思路和昨天的子集2有点像,但昨天的题是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,因为排完序的数组都是自增子序列了。解决......