Skip to content

面试速答(先看这里)

**一句话结论:**有一堆桃子,猴子第一天吃了一半加一个,第二天又吃了一半加一个,第三天又吃了一半加一个,以此类推,到第10天时只剩下一个桃子,问这堆桃子原来有多少个?

60秒标准回答:

有一堆桃子,猴子第一天吃了一半加一个,第二天又吃了一半加一个,第三天又吃了一半加一个,以此类推,到第10天时只剩下一个桃子,问这堆桃子原来有多少个?

这是一道经典的编程题目

>猴子每天都吃了剩下桃子的一半再加一个。如果我们从第10天开始反推到第1天,计算过程如下

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • 要点1:>猴子每天都吃了剩下桃子的一半再加一个。
  • **要点2:**因此,最开始这堆桃子共有1534个。
  • **要点3:**这里的<< 是向左移一位,在二进制中向左移一位,在十进制中就是*2的意思。

**记忆锚点:**到第10天时剩下一个桃子 → 以此类

加分表达:

  • 如果我们从第10天开始反推到第1天,计算过程如下: 第10天 :剩下1个桃子。

追问准备:

  • 围绕「到第10天时剩下一个桃子」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「以此类」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

有一堆桃子,猴子第一天吃了一半加一个,第二天又吃了一半加一个,第三天又吃了一半加一个,以此类推,到第10天时只剩下一个桃子,问这堆桃子原来有多少个?

这是一道经典的编程题目。

&gt;猴子每天都吃了剩下桃子的一半再加一个。如果我们从第10天开始反推到第1天,计算过程如下:

  • 第10天:剩下1个桃子。
  • 第9天:第10天之前,桃子的数量是(1 + 1)* 2 = 4个。
  • 第8天:第9天之前,桃子的数量是(4 + 1)* 2 = 10个。
  • 第7天:第8天之前,桃子的数量是(10 + 1)* 2 = 22个。
  • 第6天:第7天之前,桃子的数量是(22 + 1)* 2 = 46个。
  • 第5天:第6天之前,桃子的数量是(46 + 1)* 2 = 94个。
  • 第4天:第5天之前,桃子的数量是(94 + 1)* 2 = 190个。
  • 第3天:第4天之前,桃子的数量是(190 + 1)* 2 = 382个。
  • 第2天:第3天之前,桃子的数量是(382 + 1)* 2 = 766个。
  • 第1天:第2天之前,桃子的数量是(766 + 1)* 2 = 1534个。

因此,最开始这堆桃子共有1534个。

那么代码如下:

plain
public static void main(String[] args) {
    int total = 1;
    for(int i=10; i>1; i--){
        total = (total+1)<<1;
    }
    System.out.println(total);
}

> 这里的<< 是向左移一位,在二进制中向左移一位,在十进制中就是*2的意思。

最终得到1534