人啊,总是喜欢自以为是。尤其是在刷题的时候,我们总喜欢说,这题我会,这题我会,然后就被啪啪打脸,打肿的那种。两天不刷题,果然没手感了,还是要坚持学习啊。
打脸实录
题目:
柠檬水找零钱分析:
问题仔细一看不难,顾客给钱,你找钱。顾客是排队来的,你一开始没本钱,人家给你10块,你就得找五块,人家给你20你就得找15块(一张10块的+一张五块的 or 三张五块的)。结果很清晰,直接上手定义一个result
数组来模拟存储你当前有的本钱,一开始就是空的。
代码:
class Solution:
def lemonadeChange(self, bills) -> bool:
if len(bills) == 0:
return True
if bills[0] != 5:
return False
result = [] # 自己手里的钱
for i in bills:
if i == 10: # 10块要找5块
if result.count(5) != 0:
result.remove(5) # 找五块
result.append(10) # 收十块
else:
return False # 没有五块找不了了
if i == 20: # 20块要找5块10块
if result.count(5) != 0 and result.count(10) != 0:
result.remove(5) # 找五块
result.remove(10) # 找10块
result.append(20) # 收20块
elif result.count(5) >= 3:
result.remove(5)
result.remove(5)
result.remove(5)
result.append(20) # 收20块
else:
return False # 没有五块找不了了
if i == 5:
result.append(5)
print(result)
else:
return True
s = Solution()
print(s.lemonadeChange([5, 5, 10, 20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 20, 5, 20, 5]))
# print(s.lemonadeChange([5, 5, 10]))
# print(s.lemonadeChange([10, 10]))
# print(s.lemonadeChange([5, 5, 10, 10, 20]))
结果:
结果代码分析与优化:
自认为,代码虽然很长但也可以说逻辑清晰,但是结果却令人抓狂。1328ms在这种问题上是无法忍受的。仔细分析看人家大佬的评论才知道,我是多么的年轻。
我为什么要把零钱真的就像是模拟人家的口袋一样存下来,然后每次找钱还需要去口袋里翻着找。一来增加了存储空间,而来多了查找的时间。其实只需要记录一下你有多少张5块的,多少张10块的就好了,单纯的对数字操作,存储空间不大,也不需要查找,害。
大佬代码:
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
five, ten = 0, 0
for b in bills:
if b == 5:
five += 1
elif b == 10:
if not five: return False
five -= 1
ten += 1
else:
if ten and five:
ten -= 1
five -= 1
elif five > 2:
five -= 3
else:
return False
return True
事后烟:
年轻付出了太多代价,但是慢慢也会长大,加油吧。
网友评论