题目:模拟发牌
有 n 张编号为 1 到 n 的牌,按顺序发给 m 个人。
发牌规则:
样例输入:
7 3
样例输出:
1 4 7 2 5 3 6
💡 输出说明:
第1行:第1个人得到的牌(1, 4, 7)
第2行:第2个人得到的牌(2, 5)
第3行:第3个人得到的牌(3, 6)
取模运算实现循环分配
第 k 张牌应该发给第几个人?
person = (k - 1) % m + 1
公式推导(以 m=3 为例):
| k | (k-1) % 3 | +1 后 | 发给谁 |
|---|---|---|---|
| 1 | 0 | 1 | 第1人 |
| 2 | 1 | 2 | 第2人 |
| 3 | 2 | 3 | 第3人 |
| 4 | 0 | 1 | 第1人 |
| 5 | 1 | 2 | 第2人 |
| 6 | 2 | 3 | 第3人 |
| 7 | 0 | 1 | 第1人 |
代码思路:
不使用额外存储,用双重循环:
j % m == i % m,则牌j属于人i核心公式:
第 k 张牌 → 第 (k-1) % m + 1 个人
代码实现要点:
复杂度分析:
关键理解:
i % m 的取值范围是 0, 1, 2, ..., m-1j % m == i % m 找到所有属于第i个人的牌考察知识点:
易错点:
拓展思考:
举一反三:
取模运算的典型应用场景: