妙用Python集合求解啤酒问题(携程2016笔试题)

问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。那么,本来有多少升啤酒呢?

解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客必须买走剩下的3桶啤酒才有可能是第一位顾客的2倍。假设第一位顾客买走的葡萄酒共L升,那么第二位顾客买走的是2L升。也就是说,葡萄酒的总数应该能被3整除。

buckets = {30, 32, 36, 38, 40, 62}

for item in buckets: if sum(buckets - {item}) % 3 == 0: print(item) break

上面是第一版本的代码,写完再看了一眼,觉得还是啰嗦了,不够Pythonic,于是改成了下面的代码。

buckets = {30, 32, 36, 38, 40, 62}

total = sum(buckets)

for item in buckets: if (total-item) % 3 == 0: print(item) break

第二段代码比第一段代码效率略高,作为题目本身而言,做到这里就足够了,但是写代码的话还是要考虑的更全面一些。上面两段代码都没有考虑到一个问题,那就是酒商只卖整桶酒。如果考虑到这个问题的话,代码就变成了下面的样子。

buckets = {30, 32, 36, 38, 40, 62}

def solve(buckets): #适用于6桶酒问题 assert len(buckets)==6 #酒的总量 total = sum(buckets) #枚举法,逐个测试哪个是啤酒 for item in buckets: div, mod = divmod((total-item), 3) #葡萄酒数量应能被3整除 if mod == 0: #除以3之后的整商应恰为某2桶酒之和 for i in buckets: j = div-i if j!=i and (j in buckets): return (item, (i,j)) return 'no answer'

print(solve(buckets))

本题答案是40

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-02-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

R、Python、Scala 和 Java,到底该使用哪一种大数据编程语言?

当你找到大数据项目,你首先会怎么做?确定这个项目的问题领域,确定这个项目的基础设施,在往上,确定项目的框架,选择最适合用来处理当前数据的所有内容。这个时候唯一摆...

3895
来自专栏微信公众号:Java团长

成为优秀Java程序员的10大技巧

Java程序员有许多应遵循的守则或最佳实践方式。本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果。

1042
来自专栏C语言及其他语言

[每日一题]欧拉筛选法判断素数

今天给大家的是一种效率比较高(逼格一样高哦)的方法,叫欧拉线性筛选法 题目描述 用筛法求之N内的素数。 输入 N 输出 0~N的素数 样例输入 100 样例输出...

4406
来自专栏web编程技术分享

小兔JS教程(一) -- 环境搭建与JavaScript初探1.开发环境搭建2.JavaScript初探

3509
来自专栏牛客网

热乎乎的网易游戏游戏研发工程师一面

面试小哥哥人很好说话,没有自我介绍直接进入主题,先聊了C++,然后数据结构,最后两道算法题

2492
来自专栏PHP在线

程序人生的寂静欢喜

原文出处: caojueming 标题起得太大咯,是在故作老成么? “程序人生的寂静欢喜”——怎么看都感觉像是某位已故计算机大师的墓志铭,可却偏偏被一个菜...

2863
来自专栏牛客网

面经--微博&&今日头条

1980
来自专栏程序人生 阅读快乐

编写高质量代码:改善Java程序的151个建议

在通往“Java技术殿堂”的路上,本书将为你指点迷津!内容全部由Java编码的最佳实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面对J...

901
来自专栏noteless

6.计算机语言的发展 编程语言发展 编程语言类型 为什么会有编程语言 编程语言什么作用 机器语言 高级语言分类 编程语言历史 编程语言有哪些 编程语言编年史

随后,开始用与代码指令实际含义相近的英文缩写词、字母和数字等符号来替代描述指令代码

1882
来自专栏SnailTyan

C语言的起源

C语言是贝尔实验室的Dennis Ritchie于1969年~1973年间创建的。美国国家标准学会(American national standards in...

2200

扫码关注云+社区

领取腾讯云代金券