有1000瓶水,3个瓶子可以再换1瓶,一共可以喝多少瓶?
朋友说了一个面试算法题,题目大概意思为:"有1000瓶水,3个瓶子可以再换1瓶,一共可以喝多少瓶?"一时兴起,就分析了一下,并且代码实现了。
分析如下:
1000分为能被3整除的,和不能整除的。1000=999+1:999又可以换333瓶水,1可以先放着,等和后面换的凑成3的倍数,就可以接着换了(没换到也计入总数)。然后333瓶接着换..., 结果为1499
写成程序分析如下
方法1:假设一开始有n瓶水,f(n) = n/3*3 + f(n/3 + n%3),当n<3,直接返回n
方法2:模拟真实喝水过程,1瓶1瓶的喝,累计到3个空瓶子就去再换1瓶,然后手里水的个数就加1。喝1瓶水total加1,直到水为0.
程序如下:
1 public class Main { 2 public static void main(String[] args) { 3 System.out.println(f(1000)); 4 System.out.println(g(1000)); 5 } 6 7 //算法1 8 static int f(int n) { 9 if (n < 3) return n; 10 int m = n / 3 * 3; 11 int t = n % 3 + n / 3; 12 return m + f(t); 13 } 14 15 //算法2 16 static int g(int n) { 17 int total = 0; 18 int counter = 0; 19 while (n > 0) { 20 --n; 21 ++total; 22 ++counter; 23 if (counter == 3) { 24 counter = 0; 25 ++n; 26 } 27 } 28 return total; 29 } 30 }