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


    问题描述:一位酒商共有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

  • 相关阅读:
    jsp带参转链接
    HTML select 操作
    HTML5 微信二维码提示框
    IOS 开发 【objective-c 基础1】
    {每日一题}:一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?
    python编程系列---多线程共享全局变量出现了安全问题的解决方法
    3.如何理解开多线程可以充分利用CPU?
    python编程系列---最详细的讲解进程与线程的关系
    {每日一题}:随机输入四个不同的数字,求:能组成多少个互不相同且无重复数字的三位数?各是多少?
    2.单核CPU是如何实现多进程的?
  • 原文地址:https://www.cnblogs.com/zhaohongtian/p/6807348.html
Copyright © 2020-2023  润新知