码迷,mamicode.com
首页 > 编程语言 > 详细

Python求解啤酒问题(携程2016笔试题)

时间:2017-05-04 16:17:29      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:int   gif   解法   比较   length   题目   葡萄酒   写法   应该   

问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,
并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。
那么,本来有多少升啤酒呢?
解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客必须买走剩下的3桶葡萄酒才有可能是第一位顾客的2倍。
假设第一位顾客买走的葡萄酒共L升,那么第二位顾客买走的是2L升。也就是说,葡萄酒的总数应该能被3整除。所以,解法就呼之欲出了。

Python 解法1 

1 buckets = {30,32,36,38,40,62}
2 total = sum(buckets)
3 for item in buckets:
4     if (total-item) % 3 == 0:
5         print(item)
6         break

虽然这样也能简单的解决问题,但是再考虑多一点,注意题目“只卖整桶”这个限制条件,更加规范的解法如下(但似乎没什么必要)

解法2

技术分享
 1 buckets = {30,32,36,38,40,62}
 2 def solve(buckets):
 3     total = sum(buckets)
 4     for item in buckets:
 5         div,mod = divmod((total-item),3)
 6         if mod == 0:            
 7             for i in buckets:
 8                 j = div - i
 9                 if j!=i and (j in buckets):
10                     return (item,(i,j))
11     return ‘no answer‘
12     
13 print(solve(buckets))
技术分享

代码中第8行 因为第一个顾客买的是2桶酒之和,所以验证是否存在这2桶酒,假如不存在即返回no answer。

 

Java 实现(java底子比较浅,写起来代码很难看,如果有更好的写法希望能赐教一下)

技术分享
 1 public static int bear(){
 2         int buckets[] = {30,32,36,38,40,62};
 3         int sum = 0;
 4         for(int bs :buckets){
 5             sum += bs;
 6         }
 7         for(int i=0;i<6;i++){
 8             int rest = sum-buckets[i];
 9             int mod = rest % 3;
10             if(mod == 0) {
11                 int div = rest / 3;
12                 for(int j=0;j<6;j++){
13                     int sep = div - buckets[j];
14                     if(sep != buckets[j] && InBuckets(sep,buckets)){
15                         return buckets[i];
16                     }
17                 }
18             }
19         }
20         return 0;
21     }
22 
23 public static boolean InBuckets(int x,int[] buckets){
24         for(int i=0;i<buckets.length;i++){
25             if(x == buckets[i]){
26                 return true;
27             }
28         }
29         return false;
30     }
技术分享

参考资料 微信号 Python_xiaowu

Python求解啤酒问题(携程2016笔试题)

标签:int   gif   解法   比较   length   题目   葡萄酒   写法   应该   

原文地址:http://www.cnblogs.com/zhaohongtian/p/6807348.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!