青训营X豆包MarsCode 技术训练营之学习方法及心得 | 豆包MarsCode AI 刷题

98 阅读3分钟

一.题目:

小S有一批糖果 candies,他打算将这些糖果分给排成一列的 n 个小朋友。糖果的分发规则如下:

  1. 第一个小朋友获得 1 颗糖果,第二个小朋友获得 2 颗糖果,依此类推,直到第 n 个小朋友获得 n 颗糖果。
  2. 然后回到队伍的起点,继续分糖果。第一个小朋友这次获得 n + 1 颗糖果,第二个小朋友获得 n + 2 颗,依此类推,直到第 n 个小朋友获得 2 * n 颗糖果。
  3. 重复上述过程,每次分发的糖果数增加 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. 初始化:我们需要一个数组来存储每个小朋友最终获得的糖果数。
  2. 分发糖果:我们需要一个循环来模拟糖果的分发过程,直到糖果分完为止。
  3. 计算当前轮次的糖果数:每一轮分发的糖果数是递增的,从1开始,直到糖果分完。
  4. 更新糖果数:每次分发后,更新剩余的糖果数,并记录每个小朋友获得的糖果数。

三.编写代码:

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])

四.关键步骤解释

  1. 初始化结果数组:result = [0] * n 用于存储每个小朋友最终获得的糖果数。
  2. 分发糖果的循环:while candies > 0 确保糖果分发直到糖果分完。
  3. 遍历每个小朋友:for i in range(n) 遍历每个小朋友,确保每个小朋友都能获得糖果。
  4. 更新糖果数:result[i] += current_candy 更新当前小朋友的糖果数,candies -= current_candy 更新剩余的糖果数,current_candy += 1 增加当前轮次的糖果数。