鱼C论坛

 找回密码
 立即注册
查看: 1966|回复: 36

[已解决]Python:每日一题 328

[复制链接]
发表于 2020-2-9 21:42:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-2-9 22:00 编辑

今天的题目:


假设在你的柠檬水摊上,每一杯柠檬水的售价为 5 美元。

顾客排队购买你的产品,按账单 bills 支付的顺序一次购买一杯。

每位顾客只买一杯柠檬水并向你付 bills[a] 美元(bills[a] 只可能是 5、10 或 20),也就是说净交易是每位顾客向你支付 5 美元。你必须给每个顾客正确找零(如果可能)。

一开始你手头没有任何零钱。

如果你能给每位顾客正确找零则返回 True ,否则返回 False。

示例 1:

输入:bills = [5, 5, 5, 10, 20]
输出:True
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票并找回 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以输出 True。
示例 2:

输入:bills = [5, 5, 10, 10, 20]
输出:False
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于最后一位顾客没有得到正确的找零,所以答案是 False。


欢迎大家一起答题!
最佳答案
2020-2-10 12:49:58
本帖最后由 fan1993423 于 2020-2-11 16:34 编辑
  1. def fun328(lst):
  2.     bill_dict={5:0,10:0}
  3.     for i in lst:
  4.         if i==5:
  5.             bill_dict[i]+=1
  6.         elif i==10:
  7.             bill_dict[i]+=1
  8.             bill_dict[5]-=1
  9.             if bill_dict[5]<0:
  10.                 return False
  11.         else:
  12.             bill_dict[10]-=1
  13.             bill_dict[5]-=1
  14.             if bill_dict[10]<0 or bill_dict[5]<0:
  15.                 bill_dict[10]+=1
  16.                 bill_dict[5]-=2
  17.                 if bill_dict[5]<0:return False
  18.     return True
复制代码

无脑解的,因为只有5,10,20这几种面值,如果面值多了,应该不能无脑解

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-9 21:44:47 | 显示全部楼层
前排
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-9 21:59:40 | 显示全部楼层
问题。20,15也算一张钞票么,题目意思,只要在bills内元素都算一张钞票
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 22:00:50 | 显示全部楼层
塔利班 发表于 2020-2-9 21:59
问题。20,15也算一张钞票么,题目意思,只要在bills内元素都算一张钞票

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:04:03 | 显示全部楼层
这题我提出一个问题,不是程序上的,而是认知上的,因为顾客有先来后到 如果知道所有顾客的钱数 你是有可能安排合理的找钱顺序的 来避免后面无钱可找
但是 实际生活中 这是不可能的 你不可能知道后面的人得钱是多少 找钱不同的形式可能会导致后期找不开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 22:05:13 | 显示全部楼层
TJBEST 发表于 2020-2-9 22:04
这题我提出一个问题,不是程序上的,而是认知上的,因为顾客有先来后到 如果知道所有顾客的钱数 你是有可能 ...

这只是一个题目忽略掉这些问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:33:20 | 显示全部楼层
  1. class Solution:
  2.     def lemonadeChange(self, bills: List[int]) -> bool:
  3.         dict1={5:0,10:0}
  4.         for i in bills:

  5.             if i == 5:
  6.                 dict1[5] += 1
  7.             
  8.             elif i == 10:
  9.                 if dict1[5]:
  10.                     dict1[5] -= 1
  11.                     dict1[10] += 1
  12.                 else:
  13.                     return False
  14.             else:
  15.                 if dict1[10] and dict1[5]:
  16.                     dict1[5] -= 1
  17.                     dict1[10] -= 1
  18.                 elif dict1[5] >= 3:
  19.                     dict1[5] -= 3
  20.                 else:
  21.                     return False
  22.         return True
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:38:34 | 显示全部楼层
明天再来吧,今天太晚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:41:19 | 显示全部楼层
本帖最后由 William4869 于 2020-2-9 22:43 编辑
  1. def f328(x):
  2.     num=[0,0]
  3.     for i in range(len(x)):
  4.         if x[i]==5:
  5.             num[0]+=1
  6.         if x[i]==10:
  7.             if num[0]==0:
  8.                 return False
  9.             num[1]+=1
  10.             num[0]-=1
  11.         if x[i]==20:
  12.             if num[1]>=1 and num[0]>=1:
  13.                 num[1]-=1
  14.                 num[0]-=1
  15.             elif num[0]>=3:
  16.                 num[0]-=3
  17.             else:
  18.                 return False
  19.         #print(num)
  20.     return True

  21. print(f328([5,5,10,10,20]))
复制代码


无脑解法,,反正情况很少

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:54:34 | 显示全部楼层
美元有50,和100的要不要考虑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:58:14 | 显示全部楼层
算了,今日事今日毕吧 我刚看错题了 以为 钱有很多种了 原来才3钟钱啊 如果 超过 三种 就得递归了
  1. def fun328(bills):
  2.     money = {5:0,10:0}
  3.     for each in bills:
  4.         if each == 5:
  5.             money[5] += 1
  6.         elif each == 10:
  7.             if money[5] > 0:
  8.                 money[10] += 1
  9.                 money[5] -= 1
  10.             else:
  11.                 return False
  12.         else:
  13.             if money[5] == 0:
  14.                 return False
  15.             elif money[10]==0:
  16.                 if money[5] > 2:
  17.                     money[5] -= 3
  18.                 else:
  19.                     return False
  20.             else:
  21.                 money[5] -= 1
  22.                 money[10] -= 1
  23.     return True
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 22:59:34 | 显示全部楼层
TJBEST 发表于 2020-2-9 22:04
这题我提出一个问题,不是程序上的,而是认知上的,因为顾客有先来后到 如果知道所有顾客的钱数 你是有可能 ...

涉及实际生活那问题可就太复杂了,因为实际生活中必然有人际交往,某商户自己没有零钱了可以找另一家商户进行找零行动,这是小商贩必然会遇到的问题。当然,前提是进行现金交易,要是各个都是用电子货币进行交易,那么就不存在找零的问题了甚至。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:02:31 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-2-10 18:26 编辑

def f328(L:list)->bool:
    L1=[]
    for i in L:
        if i==5:
            L1.append(i)
        elif i==10:
            if 5 in L1:
                L1.remove(5)
                L1.append(i)
            else:
                return False
        else:
            if 5 in L1 and 10 in L1:
                L1.remove(5)
                L1.remove(10)
                L1.append(i)
            else:
                return False
    else:
        return True

print(f328([5,5,10,10,5]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:14:39 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-2-9 23:23 编辑

按照楼主的描述,好像不涉及有其他商贩可以进行零钱交易的渠道,那么我就苦恼了,比较纠结。
比如:
  1. bills = [5, 5, 5, 10, 5, 20, 10]
复制代码
这种情况我是返回 True 还是 False 呢?
在倒数第二位客人找 3*5 或者 5+10 都可以。但是到最后,使用第一个方案最后一位客人无法找零,方案二则可以。
“能不能” 这种说法仿佛是在指某种方法能不能完成这件事,但是却没有给出相应的方法(找零原则),也就是可以理解为按照读者所想的规则能不能完成此事。
如果说我给出的例子,需要的返回值必须是 True 的话,那么题目描述我认为应当改成“是否存在给每位顾客正确找零的方法”。因为,这样的语句语义更加符合需要的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:48:34 | 显示全部楼层
  1. def fun328(bills):
  2.     change = [0,0,0]
  3.     for each in bills:
  4.         if(each == 5):
  5.             change[0] += 1
  6.         elif(each == 10):
  7.             if(change[0] >= 1):
  8.                 change[1] += 1
  9.                 change[0] -= 1
  10.             else:
  11.                 return False
  12.         elif(each == 20):
  13.             if(change[0] >= 1 and change[1] >= 1):
  14.                 change[0] -= 1
  15.                 change[1] -= 1
  16.                 change[2] += 1
  17.             elif(change[0] >= 3):
  18.                 change[0] -= 3
  19.                 change[2] += 1
  20.             else:
  21.                 return False
  22.     return True
复制代码


话说这玩意有其他解法吗

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:52:58 | 显示全部楼层
阴阳神万物主 发表于 2020-2-9 23:14
按照楼主的描述,好像不涉及有其他商贩可以进行零钱交易的渠道,那么我就苦恼了,比较纠结。
比如:这种情 ...

这个不用纠结啊,就是能用第二种用第二种,第二种不行,才用第一种,因为不管哪种,用5元都能找开,但是用十元找的只看是20的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-10 00:12:07 | 显示全部楼层
546623863 发表于 2020-2-9 23:52
这个不用纠结啊,就是能用第二种用第二种,第二种不行,才用第一种,因为不管哪种,用5元都能找开,但是 ...

嗯,因为我想象力旺盛,并且代入感较强,顺便还有点自大。
万一来的人特别多,我是倾向于先把面值小的给找出去,因为揣在兜里的现金从体积上来说越小越好,如果说收入 10000 难道揣 2000 张 面值为 5 的货币,能只揣500张为啥要揣2000张?摆摊卖货,基本上就是把货币揣身上,摊子不带走或者藏在近处。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-10 00:40:13 | 显示全部楼层
本帖最后由 yexing 于 2020-2-10 11:40 编辑

试了试用列表来储存数据,写的时候思路不是很清晰,可能存在未发现的 bug :
  1. class Shop:
  2.     def __init__(self, bills:[int]):
  3.         self.bills = bills
  4.         self.bank = []

  5.     def calculate(self) -> bool:
  6.         for bill in self.bills:  
  7.             if self.bank and bill != 5:
  8.                 for change in self.bank:
  9.                     temp = bill
  10.                     if change < bill:
  11.                         bill -= change
  12.                         self.bank.remove(change)
  13.                     elif len(self.bank)==0 and bill != 5:
  14.                         return False
  15.                     elif len(self.bank)==1 and bill < change:
  16.                         return False
  17.                     elif bill == 5:
  18.                         self.bank.append(temp)
  19.                         break
  20.                
  21.             elif bill == 5:
  22.                 self.bank.append(bill)
  23.                 self.bills.remove(bill)
  24.             elif bill != 5 and not self.bank:
  25.                 return False
  26.         return True
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-10 03:53:22 | 显示全部楼层
本帖最后由 kinkon 于 2020-2-10 13:48 编辑
  1. def f328(bills):
  2.     if bills[0]!=5:
  3.         return False
  4.     n=[0,0]
  5.     for bill in bills:
  6.         if bill==5:
  7.             n[0]+=5
  8.         elif bill==10:
  9.             n[1]+=10
  10.             n[0]-=5
  11.             if n[0]<0:return False
  12.         else:
  13.             if n[1]>=10 and n[0]>=5:
  14.                 n[1]-=10
  15.                 n[0]-=5
  16.             elif n[1]==0 and n[0]>=15:
  17.                 n[0]-=15
  18.             else:
  19.                 return False
  20.     return True
  21.    
  22. bills=[5,5,10,10,20]
  23. bills1=[5,5,5,10,20]
  24. print(f328(bills))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-10 11:32:50 | 显示全部楼层
  1. def fun328(bills):
  2.     dict_bills = {'5':0,'10':0}
  3.     for i in bills:
  4.         if i == 5:
  5.             dict_bills['5'] += 1
  6.         if i == 10:
  7.             if not dict_bills['5']:
  8.                 return False
  9.             dict_bills['5'] -= 1
  10.             dict_bills['10'] += 1
  11.         if i == 20:
  12.             if dict_bills['10'] and dict_bills['5']:
  13.                 dict_bills['5'] -= 1
  14.                 dict_bills['10'] -= 1
  15.                 print(dict_bills)
  16.             elif not dict_bills['10'] and dict_bills['5'] >= 3:
  17.                 dict_bills['5'] -= 3
  18.             else:
  19.                 return False
  20.     return True
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表