问题描述:
有两个容量分别为 x
升 和 y
升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好z
升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z
升 水。
你允许:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1:
输入: x = 3, y = 5, z = 4
输出: True
个人理解,步骤:
(1)y = 5
先满上
(2)y - x
现在 y=2
,x=0
(3)x = y
,x = 2
,y=0
(4)y = 5
满上
(5)用y
把x
满上,现在 y = 4
,OK了。
示例 2:
输入: x = 2, y = 6, z = 5
输出: False
问题分析:
分析题目之前先介绍一个定理:
裴蜀定理(贝祖定理): 对于给定的正整数x
、y
,方程a*x+b*y=c
有解的充要条件为c
是gcd(x, y)
的整数倍 。(至于证明,感兴趣可以深入研究哦)
现在开始分析题目:
题目大概意思是,使用两个水壶,容量分别为 x
、y
升,然后那,你可以相互倒水,最后用这两个水壶给出z
升水来,切记,最后是用这两个水壶的哦。
(1)首先第一个条件是,x+y>=z
,原因是,如果x+y
小于z
,那么怎么也盛不出z
升水来。
(2)很显然,题目可以转成了a*x+b*y=z
,然后求a
、b
,其实就是判断a、b的解是否存在,即可。现在,就可以使用裴蜀定理 来判断,a*x+b*y=z
是否有解了,即判断,z
是不是gcd(x, y)
的整数倍
Python3实现:
# 平安科技 2019-03-20 20:00:00 春招笔试题
class Solution:
def canMeasureWater(self, x, y, z):
import math
if x and y:
return x + y >= z and z % math.gcd(x, y) == 0
else:
return z == x or z == y
if __name__ == '__main__':
solu = Solution()
print(solu.canMeasureWater(3, 5, 4))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。