鱼C论坛

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

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

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

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

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

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

该死的电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。(这电影院为什么不倒闭算了。)
现有的货币面值为100,50,25三种。现在有n个人需要买票,且排队顺序不许变,请你根据他们手中的钱计算出,售票机能否进行找零。可以则返回yes,不可以则返回no
def tickets(people):
    # your code
    return ?
例:
tickets([25,25,50])   --->'yes'
tickets([25,50])  --->'yes'
tickets([25,100])  --->'no'
tickets([50,50,100])  --->'no'
tickets([25,50,100]) --->'no'
print(tickets([100, 50, 25, 25]))  --->'no' # 由于排队数序不许变,这个本可以交易的组合无法进行交易。
给出一段测试代码,避免你们自己去兑答案了。
以下代码保存为test.py,后import可用
def assert_equals(func, target):
    if func == target:
        print('Success!')
    else:
        print('Fail!{0} not equals {1}'.format(func, target))
test.assert_equals(tickets([25, 25, 50]), 'YES')
test.assert_equals(tickets([25, 100]), 'NO')
test.assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 25, 25, 25]), 'YES')
test.assert_equals(tickets([50, 50, 50, 50, 50, 50, 50, 50, 50, 50]), 'NO')
test.assert_equals(tickets([100, 100, 100, 100, 100, 100, 100, 100, 100, 100]), 'NO')
test.assert_equals(tickets([25, 25, 25, 25, 50, 100, 50]), 'YES')
test.assert_equals(tickets([50, 100, 100]), 'NO')
test.assert_equals(tickets([25, 25, 100]), 'NO')
test.assert_equals(tickets([25, 25, 50]), 'YES')
test.assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]),'NO')
test.assert_equals(tickets([25, 100]), 'NO')
test.assert_equals(tickets([50, 50, 100]), 'NO')
test.assert_equals(tickets([25, 50, 100]), 'NO')
test.assert_equals(tickets([25, 25, 50, 50, 100]), 'NO')
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 编辑

我写了一个,把你上面的测试了,全部正确
def tickets(nums):
  lis = []
  try:
    for money in nums:
      if money == 25:
        lis.append(money)
      elif money ==50:
        lis.append(50)
        lis.remove(25)
      else:
        lis.append(100)
        try:
          lis.remove(25)
          lis.remove(50)
        except:
          lis.remove(25)
          lis.remove(25)
          lis.remove(25)
    return "yes"
  except:
    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 | 显示全部楼层
sx=[25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]
def tick(aa=[25]):
    a=0
    b=0
    while aa!=[]:
        if aa[0]==25:
            a+=1
        elif aa[0]==50:
            a-=1
            b+=1
        else:
            if b>0:
                b-=1
                a-=1
            else:
                a-=3
        if a<0:
            return 'NO'
        aa=aa[1:]
    return 'YES'

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吧
# 用列表来存储收入的 25和50 两种面额,找零时删除,当列表不足够找零时break
def tickets(p):
    """传入排队人员钞票面值列表 p(25,50,100 三种面值),判断能否成功找零"""
    saves = []
    for i in p:
        if i == 25:
            saves.append(i)
        elif i == 50 and saves.count(25):
            saves.remove(25)
            saves.append(50)
        elif i == 100 and saves.count(50) and saves.count(25):
            saves.remove(50)
            saves.remove(25)
        elif i == 100 and saves.count(25)>=3:
            for j in range(3):
                saves.remove(25)
        else:
            break
    else:
        print('yes')
        return
    print('no')
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

num_25 = 0

for i in range(len(list_q)):
    if list_q[i] == 25 :
        num_25 += 1
    elif list_q[i] == 50 :
        num_25 -= 2
    elif list_q[i] == 100 :
        num_25 -= 3
if  num_25 < 0 :
    print('不行')
else:
    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 | 显示全部楼层
def tickets(people):
        try:
                if people[0] == 25:
                        for i in people[1:]:
                                if i == 25:
                                        continue
                                elif i == 50:
                                        people.remove(25)
                                else:
                                        if 50 in people:
                                                people.remove(50)
                                                people.remove(25)
                                        else:
                                                people.remove(25)
                                                people.remove(25)
                                                people.remove(25)
                else:
                        return 'NO'
        except:
                return 'NO'
        return 'YES'
a = tickets([25,25,50])
b = tickets([25,100])
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 编辑
def assert_equals(func, target):
    if func == target:
        print('Success!')
    else:
        print('Fail!{0} not equals {1}'.format(func, target))

def tickets(people):
    cinema = []  # 存储影院收的钱
    for i in people:
        cinema.append(i)  # 收钱
        if not (i == 25 or\
           (i == 100 and (cinema.count(25) >= 3 or (25 in cinema and 50 in cinema))) or\
           (i == 50 and 25 in cinema)):
            # 如果不是以下三种情况,则返回'NO': 
            # 1.排队的人拿出100元,而影院有25*3或25+50的组合;
            # 2.排队的人拿出50元,而影院有25的可以找零;
            # 3.排队的人拿出的是25元的。
            # 找不开,退钱
            cinema.remove(i)
            return 'NO'
        else: # 可以找零
            if i == 100: # 对100的优先找50+25,如果不行则找25*3
                if 50 in cinema:
                    cinema.remove(25)
                    cinema.remove(50)
                else:
                    cinema.remove(25)
                    cinema.remove(25)
                    cinema.remove(25)
            elif i == 50: # 对50的找零25
                cinema.remove(25)
    return 'YES'

            
assert_equals(tickets([25, 25, 50]), 'YES')
assert_equals(tickets([25, 100]), 'NO')
assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 25, 25, 25]), 'YES')
assert_equals(tickets([50, 50, 50, 50, 50, 50, 50, 50, 50, 50]), 'NO')
assert_equals(tickets([100, 100, 100, 100, 100, 100, 100, 100, 100, 100]), 'NO')
assert_equals(tickets([25, 25, 25, 25, 50, 100, 50]), 'YES')
assert_equals(tickets([50, 100, 100]), 'NO')
assert_equals(tickets([25, 25, 100]), 'NO')
assert_equals(tickets([25, 25, 50]), 'YES')
assert_equals(tickets([25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]),'NO')
assert_equals(tickets([25, 100]), 'NO')
assert_equals(tickets([50, 50, 100]), 'NO')
assert_equals(tickets([25, 50, 100]), 'NO')
assert_equals(tickets([25, 25, 50, 50, 100]), 'NO')
assert_equals(tickets([100, 50, 25, 25]), 'NO')

# 全部成功了。不过看了下别人的答案,楼上leaves_cy的用字典的方式比较好,也容易懂。
>>> 
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-12 14:08:37 | 显示全部楼层
本帖最后由 瞬秒爆加速 于 2018-3-12 14:12 编辑
def tickets(people):
    s = 0
    for i in people:
        if s>=(i-25):
            s= s-i+50
        else:
            return 'NO'
            break
    else:
        retrun 'YES'
if __name__=="__main__":
    tickets([25,25,50])
    tickets([25,50])
    tickets([25,100])
    tickets([50,50,100])
    tickets([25,50,100])
    tickets([100, 50, 25, 25])
    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 | 显示全部楼层
'''
电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。
而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。
现有的货币面值为100,50,25三种。
现在有n个人需要买票,且排队顺序不许变
请你根据他们手中的钱计算出,售票机能否进行找零。
可以则返回yes,不可以则返回no
'''
import random
def tickets(people):
    if people[0]!=25:
        return 'no'
    else:
        tkdc={25:0,50:0,100:0}
        for i in range(len(people)):
            if people[i]==25:
                tkdc[25]+=1
            elif people[i]==50:
                tkdc[50]+=1
                tkdc[25]-=1
            elif people[i]==100:
                tkdc[100]+=1
                tkdc[50]-=1
                tkdc[25]-=1
            if  tkdc[25]<0 or tkdc[50]<0 or tkdc[50]<0:
                return 'no'
        return 'yes'

rlen=random.randint(2,16)
rmb=[25,50,100]
rp=[]
for i in range(1,rlen):
    rp.append(random.choice(rmb))
print(rp)
print(tickets(rp))

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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