青训营X豆包MarsCode 技术训练营第三课 |AI 刷题 分糖果给小朋友 题解 | 豆包MarsCode AI刷题

120 阅读2分钟

一.问题描述

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

1.第一个小朋友获得 1 颗糖果,第二个小朋友获得 2 颗糖果,依此类推,直到第 n 个小朋友获得 n 颗糖果。

2.然后回到队伍的起点,继续分糖果。第一个小朋友这次获得 n + 1 颗糖果,第二个小朋友获得 n + 2 颗,依此类推,直到第 n 个小朋友获得 2 * n 颗糖果。

3.重复上述过程,每次分发的糖果数增加 1,直到糖果分完。如果剩下的糖果数量不足以满足当前轮次分发的要求,则将所有剩余的糖果分给当前的小朋友。

你需要返回一个长度为 n 的数组,表示每个小朋友最终获得的糖果数。

二.思路分析

1.关键要素

糖果总数(candies):这是需要被分发的糖果的总数量。

小朋友数量(n):这是接收糖果的小朋友的数量,他们排成一列。

2. 初始化

创建一个长度为n的数组count,用于存储每个小朋友最终获得的糖果数。

初始化变量num为1,表示当前要分发的糖果数。

初始化变量index为0,表示当前分发到哪个小朋友(从0开始计数)。

3.分发糖果

使用一个while循环,当还有糖果剩余时(candies > 0)继续分发。

在每次循环中,检查当前要分发的糖果数num是否小于或等于剩余的糖果数candies。

如果是,将num颗糖果分发给当前的小朋友(count[index] += num),并从剩余的糖果中减去已分发的糖果数(candies -= num)。

如果不是,将剩余的糖果全部分发给当前的小朋友(count[index] += candies),并将剩余的糖果数设置为0(candies = 0),然后跳出循环。

更新当前要分发的糖果数(num++)。

更新当前分发到的小朋友索引(index = (index + 1) % n),使用模运算确保索引在0到n-1之间循环。

4. 返回结果

当所有糖果分发完毕后,返回count数组,其中包含了每个小朋友最终获得的糖果数。

三.代码详情

    public static int[] solution(int candies, int n) {
        // write code here
        int []count =new int[n];
        int num=1;
        int index=0;
        while(candies>0){
            if(candies>=num)
                {
                    count[index]+=num;
                    candies-=num;
                }
                else{
                    count[index]+=candies;
                    candies=0;
                    break;
                }
                num++;
                index=(index+1)%n;
        }

        return count;
    }

四.时间复杂度

该算法的时间复杂度是O(candies)。该算法的时间复杂度主要取决于外层循环while(candies>0)。