一.题目:
小S有一批糖果 candies,他打算将这些糖果分给排成一列的 n 个小朋友。糖果的分发规则如下:
- 第一个小朋友获得 1 颗糖果,第二个小朋友获得 2 颗糖果,依此类推,直到第 n 个小朋友获得 n 颗糖果。
- 然后回到队伍的起点,继续分糖果。第一个小朋友这次获得 n + 1 颗糖果,第二个小朋友获得 n + 2 颗,依此类推,直到第 n 个小朋友获得 2 * n 颗糖果。
- 重复上述过程,每次分发的糖果数增加 1,直到糖果分完。如果剩下的糖果数量不足以满足当前轮次分发的要求,则将所有剩余的糖果分给当前的小朋友。
你需要返回一个长度为 n 的数组,表示每个小朋友最终获得的糖果数。
测试样例
样例1:
输入:
candies = 7 ,n = 4
输出:[1, 2, 3, 1]
样例2:
输入:
candies = 10 ,n = 3
输出:[5, 2, 3]
样例3:
输入:
candies = 20 ,n = 5
输出:[6, 2, 3, 4, 5]
二.解题思路:
- 初始化:我们需要一个数组来存储每个小朋友最终获得的糖果数。
- 分发糖果:我们需要一个循环来模拟糖果的分发过程,直到糖果分完为止。
- 计算当前轮次的糖果数:每一轮分发的糖果数是递增的,从1开始,直到糖果分完。
- 更新糖果数:每次分发后,更新剩余的糖果数,并记录每个小朋友获得的糖果数。
三.编写代码:
def solution(candies: int, n: int) -> list:
# 初始化一个长度为n的数组,用于存储每个小朋友最终获得的糖果数
result = [0] * n
# 初始化当前轮次分发的糖果数
current_candy = 1
# 当还有糖果时,继续分发
while candies > 0:
# 遍历每个小朋友
for i in range(n):
# 如果当前轮次的糖果数小于等于剩余的糖果数
if current_candy <= candies:
# 更新当前小朋友的糖果数
result[i] += current_candy
# 更新剩余的糖果数
candies -= current_candy
# 增加当前轮次的糖果数
current_candy += 1
else:
# 如果当前轮次的糖果数大于剩余的糖果数,将剩余的糖果全部分给当前小朋友
result[i] += candies
candies = 0
break
return result
if __name__ == '__main__':
print(solution(candies=7, n=4) == [1, 2, 3, 1])
print(solution(candies=10, n=3) == [5, 2, 3])
print(solution(candies=20, n=5) == [6, 2, 3, 4, 5])
四.关键步骤解释
- 初始化结果数组:
result = [0] * n用于存储每个小朋友最终获得的糖果数。 - 分发糖果的循环:
while candies > 0确保糖果分发直到糖果分完。 - 遍历每个小朋友:
for i in range(n)遍历每个小朋友,确保每个小朋友都能获得糖果。 - 更新糖果数:
result[i] += current_candy更新当前小朋友的糖果数,candies -= current_candy更新剩余的糖果数,current_candy += 1增加当前轮次的糖果数。