有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 }

 

 

posted @ 2017-03-10 00:15  dreamkunk  阅读(1058)  评论(0编辑  收藏  举报