兔群繁殖之谜|青训营笔记

38 阅读2分钟

这道题目实际上是一个经典的斐波那契数列问题,只不过稍微包装了一下。我们来逐步分析一下:

问题理解

  1. 初始状态:第0个月有1对新生小兔子。
  2. 第一个月:这对小兔子成长为成年兔子,但还没有繁殖,所以还是1对兔子。
  3. 第二个月:这对成年兔子繁殖了1对新生小兔子,所以总共有2对兔子。
  4. 第三个月:原来的1对成年兔子继续繁殖1对新生小兔子,而第二个月出生的1对小兔子成长为成年兔子,所以总共有3对兔子。
  5. 第四个月:原来的2对成年兔子各繁殖1对新生小兔子,第三个月出生的1对小兔子成长为成年兔子,所以总共有5对兔子。

通过观察,我们可以发现:

  • n 个月的兔子总数等于第 n-1 个月的兔子总数加上第 n-2 个月的兔子总数。

数据结构与算法

  • 数据结构:由于我们只需要记录前两个月的兔子总数,所以可以使用两个变量来存储。
  • 算法步骤
    1. 初始化前两个月的兔子总数。
    2. 从第三个月开始,逐月计算兔子总数,直到第 A 个月。
    3. 返回第 A 个月的兔子总数。

伪代码

public static long solution(int A) {
    if (A == 1) return 1;
    if (A == 2) return 2;

    long prev1 = 1; // 第1个月的兔子总数
    long prev2 = 2; // 第2个月的兔子总数
    long current = 0;

    for (int i = 3; i <= A; i++) {
        current = prev1 + prev2; // 当前月的兔子总数
        prev1 = prev2; // 更新前两个月的兔子总数
        prev2 = current;
    }

    return current;
}

代码框架

你可以根据这个思路来修改你的代码。以下是一个代码框架:

public class Main {
    public static long solution(int A) {
        // 如果月份是1或2,直接返回对应的兔子总数
        if (A == 1) return 1;
        if (A == 2) return 2;

        // 初始化前两个月的兔子总数
        long prev1 = 1; // 第1个月的兔子总数
        long prev2 = 2; // 第2个月的兔子总数
        long current = 0;

        // 从第3个月开始计算兔子总数
        for (int i = 3; i <= A; i++) {
            // 计算当前月的兔子总数
            current = prev1 + prev2;
            // 更新前两个月的兔子总数
            prev1 = prev2;
            prev2 = current;
        }

        return current;
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution(1) == 1L);
        System.out.println(solution(5) == 8L);
        System.out.println(solution(15) == 987L);
    }
}

你可以根据这个框架来实现你的代码,并确保你的测试用例通过。