鱼C论坛

 找回密码
 立即注册
查看: 5851|回复: 42

[技术交流] python:每日一题 33

[复制链接]
发表于 2017-4-25 19:15:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ooxx7788 于 2017-4-26 14:10 编辑

该死的电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。(这电影院为什么不倒闭算了。)
现有的货币面值为100,50,25三种。现在有n个人需要买票,且排队顺序不许变,请你根据他们手中的钱计算出,售票机能否进行找零。可以则返回yes,不可以则返回no
  1. def tickets(people):
  2.     # your code
  3.     return ?
复制代码
  1. 例:
  2. tickets([25,25,50])   --->'yes'
  3. tickets([25,50])  --->'yes'
  4. tickets([25,100])  --->'no'
  5. tickets([50,50,100])  --->'no'
  6. tickets([25,50,100]) --->'no'
  7. print(tickets([100, 50, 25, 25]))  --->'no' # 由于排队数序不许变,这个本可以交易的组合无法进行交易。
复制代码

  1. 给出一段测试代码,避免你们自己去兑答案了。
  2. 以下代码保存为test.py,后import可用
  3. def assert_equals(func, target):
  4.     if func == target:
  5.         print('Success!')
  6.     else:
  7.         print('Fail!{0} not equals {1}'.format(func, target))
复制代码

  1. test.assert_equals(tickets([25, 25, 50]), 'YES')
  2. test.assert_equals(tickets([25, 100]), 'NO')
  3. test.assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 25, 25, 25]), 'YES')
  4. test.assert_equals(tickets([50, 50, 50, 50, 50, 50, 50, 50, 50, 50]), 'NO')
  5. test.assert_equals(tickets([100, 100, 100, 100, 100, 100, 100, 100, 100, 100]), 'NO')
  6. test.assert_equals(tickets([25, 25, 25, 25, 50, 100, 50]), 'YES')
  7. test.assert_equals(tickets([50, 100, 100]), 'NO')
  8. test.assert_equals(tickets([25, 25, 100]), 'NO')
  9. test.assert_equals(tickets([25, 25, 50]), 'YES')
  10. test.assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]),'NO')
  11. test.assert_equals(tickets([25, 100]), 'NO')
  12. test.assert_equals(tickets([50, 50, 100]), 'NO')
  13. test.assert_equals(tickets([25, 50, 100]), 'NO')
  14. test.assert_equals(tickets([25, 25, 50, 50, 100]), 'NO')
  15. test.assert_equals(tickets([100, 50, 25, 25]), 'NO')
复制代码


好了,下面是我的答案,但是我也不保证对,只是以上测试能通过。
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-4-25 19:35:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-25 19:39:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-25 20:17:06 | 显示全部楼层
本帖最后由 gopythoner 于 2017-4-25 20:21 编辑

我写了一个,把你上面的测试了,全部正确
  1. def tickets(nums):
  2.   lis = []
  3.   try:
  4.     for money in nums:
  5.       if money == 25:
  6.         lis.append(money)
  7.       elif money ==50:
  8.         lis.append(50)
  9.         lis.remove(25)
  10.       else:
  11.         lis.append(100)
  12.         try:
  13.           lis.remove(25)
  14.           lis.remove(50)
  15.         except:
  16.           lis.remove(25)
  17.           lis.remove(25)
  18.           lis.remove(25)
  19.     return "yes"
  20.   except:
  21.     return "no"
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-25 20:23:24 | 显示全部楼层
gopythoner 发表于 2017-4-25 20:17
我写了一个,把你上面的测试了,全部正确

我写的这个的原理就是lis = []代表了购票机器里面的钱,一开始是空的
然后根据进入的钱找钱,但是我用的try,因为有可能找不了钱,一旦找钱失败,就得到“no”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-26 06:51:14 | 显示全部楼层
练练更健康
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-26 11:22:47 | 显示全部楼层
使用字典存储25和50的个数,每次在找零钱时只需要判断25和50的组合是否够用即可。
def tickets(people):
    dict = {25: 0, 50: 0}
    for money in people:
        #print (dict)
        if money == 25:
            dict[money] += 1

        elif money == 50:
            if dict[25] > 0:
                dict[25] -= 1
                dict[money] += 1

            else:
                return "No"

        elif money == 100:
            if dict[50] > 0 and dict[25] > 0 :
                dict[50] -= 1
                dict[25] -= 1

            elif dict[25] > 2:
                dict[25] -= 3

            else:
                return "No"

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

使用道具 举报

发表于 2017-4-28 20:33:00 | 显示全部楼层
  1. sx=[25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]
  2. def tick(aa=[25]):
  3.     a=0
  4.     b=0
  5.     while aa!=[]:
  6.         if aa[0]==25:
  7.             a+=1
  8.         elif aa[0]==50:
  9.             a-=1
  10.             b+=1
  11.         else:
  12.             if b>0:
  13.                 b-=1
  14.                 a-=1
  15.             else:
  16.                 a-=3
  17.         if a<0:
  18.             return 'NO'
  19.         aa=aa[1:]
  20.     return 'YES'

  21. print(tick(sx))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-12 14:05:37 | 显示全部楼层
向大佬学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-21 18:40:42 | 显示全部楼层
本帖最后由 solomonxian 于 2017-6-21 18:42 编辑

把整个操作过程写下来了,感觉直接找几个赋值代替要方便多了,不过这样直观方便阅读也ok吧
  1. # 用列表来存储收入的 25和50 两种面额,找零时删除,当列表不足够找零时break
  2. def tickets(p):
  3.     """传入排队人员钞票面值列表 p(25,50,100 三种面值),判断能否成功找零"""
  4.     saves = []
  5.     for i in p:
  6.         if i == 25:
  7.             saves.append(i)
  8.         elif i == 50 and saves.count(25):
  9.             saves.remove(25)
  10.             saves.append(50)
  11.         elif i == 100 and saves.count(50) and saves.count(25):
  12.             saves.remove(50)
  13.             saves.remove(25)
  14.         elif i == 100 and saves.count(25)>=3:
  15.             for j in range(3):
  16.                 saves.remove(25)
  17.         else:
  18.             break
  19.     else:
  20.         print('yes')
  21.         return
  22.     print('no')
复制代码

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

使用道具 举报

发表于 2017-9-19 16:45:58 | 显示全部楼层
  1. list_q = [25,25,50]

  2. num_25 = 0

  3. for i in range(len(list_q)):
  4.     if list_q[i] == 25 :
  5.         num_25 += 1
  6.     elif list_q[i] == 50 :
  7.         num_25 -= 2
  8.     elif list_q[i] == 100 :
  9.         num_25 -= 3
  10. if  num_25 < 0 :
  11.     print('不行')
  12. else:
  13.     print('行')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 15:15:32 | 显示全部楼层
def Cinema_ticket2(list):
        machine = []  #机器里面的钱
        zhaolings = []   #排队的每个人的找零情况
        zhaoling=0  
        for l in list:  #循环所有排队的人
                if l == 25:       #25的时候直接加入machine,并标记为yes
                        zhaolings.append('yes')         
                        machine.append(l)
                elif l == 50:     #50的时候 判断machine里面是否有25块钱面值的存在
                        zhaoling = l-25
                        if zhaoling in machine:     #存在则加入machine ,标记为yes,并且找零
                                zhaolings.append('yes')
                                machine.append(l)
                                machine.remove(zhaoling)
                        else:                        #不存在标记为no
                                zhaolings.append('no')
                elif l == 100:
                        if 50 in machine:   #存在50的就判断还有没有25的
                                if 25 in machine:    #有25的就加入machine ,标记为yes,并且找零
                                        machine.append(l)
                                        machine.remove(50)
                                        machine.remove(25)
                                else:                #只有50没有25的就标记为no
                                        zhaolings.append('no')
                        elif 25 in machine:      #只存在25的就判断有没有3个25的
                                count = machine.count(25)        #判断25的个数
                                if count>2 :
                                        zhaolings.append('yes')
                                else:
                                        zhaolings.append('no')
                        else:                   #既没有50的也没有25的,就标记为
                                zhaolings.append('no')
        print (zhaolings)

        if 'no' in zhaolings:
                return 'no'
        else:
                return 'yes'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 16:34:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-20 17:16:46 | 显示全部楼层
  1. def tickets(people):
  2.         try:
  3.                 if people[0] == 25:
  4.                         for i in people[1:]:
  5.                                 if i == 25:
  6.                                         continue
  7.                                 elif i == 50:
  8.                                         people.remove(25)
  9.                                 else:
  10.                                         if 50 in people:
  11.                                                 people.remove(50)
  12.                                                 people.remove(25)
  13.                                         else:
  14.                                                 people.remove(25)
  15.                                                 people.remove(25)
  16.                                                 people.remove(25)
  17.                 else:
  18.                         return 'NO'
  19.         except:
  20.                 return 'NO'
  21.         return 'YES'
  22. a = tickets([25,25,50])
  23. b = tickets([25,100])
  24. print(a,b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-30 16:42:02 | 显示全部楼层
def fun(temp):
    dic={}
    for item in temp:
        if int(item)== 25 and item in dic:
            dic[str(item)]+=1
        if int(item)==25 and item not in dic:
            dic[str(item)]=1
        if int(item)==50 and item in dic:
            if dic[str(25)]>=1:
                dic[str(item)]+=1
                dic[str(25)]-=1
            else:
                break
        if int(item)==50 and item not in dic:
            if dic[str(25)]>=1:
                dic[str(item)]=1
                dic[str(25)]-=1
            else:
                break
        if int (item)==100 and item in dic:
            if (dic[str(25)]>=1 and dic[str(50)]>=1) or dic[str(25)]>=3:
                dic[str(item)]+=1
                if dic[str(50)]>=1:
                    dic[str(50)]-=1
                    dic[str(25)]-=1
                    dic[str(item)]+=1
                else:
                    dic[str(25)]=dic[str(25)]-3
                    dic[str(item)]+=1
            else:
                break
        if int (item)==100 and item not in dic:
            if (dic[str(25)]>=1 and dic[str(50)]>=1) or dic[str(25)]>=3:
                dic[str(item)]=1
                if dic[str(50)]>=1:
                    dic[str(50)]-=1
                    dic[str(25)]-=1
                    dic[str(item)]=1
                else:
                    dic[str(25)]=dic[str(25)]-3
                    dic[str(item)]=1
            else:
                break
    print(dic)
if __name__=='__main__':
    temp=input("请输入一组数据")
    fun(list(temp.split(",")))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-26 08:51:47 | 显示全部楼层
def tickets(people):
    s25=0
    s50=0
    s100=0
    ##100找75,为50,25各1或者25*3
    ##50找25
    y='yes'
    while people:
        i=people.pop(0)
        if i==25:
            s25+=1
        elif i==50 and s25>=1:
            s25-=1
            s50+=1
        elif i==100 and s50>=1 and s25>=1:
            s50-=1
            s25-=1
            s100+=1
        elif i==100 and s25>=3:
            s25-=3
            s100+=1
        else:
            y='No'
            break
    return y

su=[25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100]
print(tickets(su))

其针对100元优先使用50+25的找钱组合,当不满足50+25组合时,使用25*3的组合,
貌似不智能,我也就这水平了......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-1 21:26:25 | 显示全部楼层
本帖最后由 shigure_takimi 于 2017-12-1 21:51 编辑
  1. def assert_equals(func, target):
  2.     if func == target:
  3.         print('Success!')
  4.     else:
  5.         print('Fail!{0} not equals {1}'.format(func, target))

  6. def tickets(people):
  7.     cinema = []  # 存储影院收的钱
  8.     for i in people:
  9.         cinema.append(i)  # 收钱
  10.         if not (i == 25 or\
  11.            (i == 100 and (cinema.count(25) >= 3 or (25 in cinema and 50 in cinema))) or\
  12.            (i == 50 and 25 in cinema)):
  13.             # 如果不是以下三种情况,则返回'NO':
  14.             # 1.排队的人拿出100元,而影院有25*3或25+50的组合;
  15.             # 2.排队的人拿出50元,而影院有25的可以找零;
  16.             # 3.排队的人拿出的是25元的。
  17.             # 找不开,退钱
  18.             cinema.remove(i)
  19.             return 'NO'
  20.         else: # 可以找零
  21.             if i == 100: # 对100的优先找50+25,如果不行则找25*3
  22.                 if 50 in cinema:
  23.                     cinema.remove(25)
  24.                     cinema.remove(50)
  25.                 else:
  26.                     cinema.remove(25)
  27.                     cinema.remove(25)
  28.                     cinema.remove(25)
  29.             elif i == 50: # 对50的找零25
  30.                 cinema.remove(25)
  31.     return 'YES'

  32.             
  33. assert_equals(tickets([25, 25, 50]), 'YES')
  34. assert_equals(tickets([25, 100]), 'NO')
  35. assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 25, 25, 25]), 'YES')
  36. assert_equals(tickets([50, 50, 50, 50, 50, 50, 50, 50, 50, 50]), 'NO')
  37. assert_equals(tickets([100, 100, 100, 100, 100, 100, 100, 100, 100, 100]), 'NO')
  38. assert_equals(tickets([25, 25, 25, 25, 50, 100, 50]), 'YES')
  39. assert_equals(tickets([50, 100, 100]), 'NO')
  40. assert_equals(tickets([25, 25, 100]), 'NO')
  41. assert_equals(tickets([25, 25, 50]), 'YES')
  42. assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]),'NO')
  43. assert_equals(tickets([25, 100]), 'NO')
  44. assert_equals(tickets([50, 50, 100]), 'NO')
  45. assert_equals(tickets([25, 50, 100]), 'NO')
  46. assert_equals(tickets([25, 25, 50, 50, 100]), 'NO')
  47. assert_equals(tickets([100, 50, 25, 25]), 'NO')

  48. # 全部成功了。不过看了下别人的答案,楼上leaves_cy的用字典的方式比较好,也容易懂。
  49. >>>
  50. Success!
  51. Success!
  52. Success!
  53. Success!
  54. Success!
  55. Success!
  56. Success!
  57. Success!
  58. Success!
  59. Success!
  60. Success!
  61. Success!
  62. Success!
  63. Success!
  64. Success!
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-12 14:08:37 | 显示全部楼层
本帖最后由 瞬秒爆加速 于 2018-3-12 14:12 编辑
  1. def tickets(people):
  2.     s = 0
  3.     for i in people:
  4.         if s>=(i-25):
  5.             s= s-i+50
  6.         else:
  7.             return 'NO'
  8.             break
  9.     else:
  10.         retrun 'YES'
  11. if __name__=="__main__":
  12.     tickets([25,25,50])
  13.     tickets([25,50])
  14.     tickets([25,100])
  15.     tickets([50,50,100])
  16.     tickets([25,50,100])
  17.     tickets([100, 50, 25, 25])
  18.     tickets([25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-16 15:09:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-16 22:34:33 | 显示全部楼层
  1. '''
  2. 电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。
  3. 而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。
  4. 现有的货币面值为100,50,25三种。
  5. 现在有n个人需要买票,且排队顺序不许变
  6. 请你根据他们手中的钱计算出,售票机能否进行找零。
  7. 可以则返回yes,不可以则返回no
  8. '''
  9. import random
  10. def tickets(people):
  11.     if people[0]!=25:
  12.         return 'no'
  13.     else:
  14.         tkdc={25:0,50:0,100:0}
  15.         for i in range(len(people)):
  16.             if people[i]==25:
  17.                 tkdc[25]+=1
  18.             elif people[i]==50:
  19.                 tkdc[50]+=1
  20.                 tkdc[25]-=1
  21.             elif people[i]==100:
  22.                 tkdc[100]+=1
  23.                 tkdc[50]-=1
  24.                 tkdc[25]-=1
  25.             if  tkdc[25]<0 or tkdc[50]<0 or tkdc[50]<0:
  26.                 return 'no'
  27.         return 'yes'

  28. rlen=random.randint(2,16)
  29. rmb=[25,50,100]
  30. rp=[]
  31. for i in range(1,rlen):
  32.     rp.append(random.choice(rmb))
  33. print(rp)
  34. print(tickets(rp))

  35. print(tickets([25, 25, 25, 25, 50, 100, 50]))
  36.         
  37.         
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 06:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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