zoukankan      html  css  js  c++  java
  • python笔记50-面试题:交换圣诞节礼物

    前言

    圣诞节快到啦,为了打造良好的工作环境,同事之间的关系和谐,现在玩一个交换礼物的小游戏。
    每个同事准备一个礼物,到时候互相交换,自己手里的礼物必须交换出去,并且得到一个其它人的礼物。

    交换礼物

    我们假设有同事A,B,C,D,E,每个人都准备了一个小礼物,给礼物对应的编号1,2,3,4,5。
    每个同事可以随机得到一个礼物,但是不能拿到自己的。

    import random
    '''
    交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    '''
    
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            del gifts[n]
    
    if __name__ == '__main__':
        while 1:
            if len(gifts) == 0:
                print("换礼物结束!")
                exit()
            x = input("输入一个员工:")
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    
    

    自由分配

    不输入员工名称,让员工自由取值。

    import random
    '''
    交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    '''
    
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            del gifts[n]
    
    if __name__ == '__main__':
        for x in people.keys():
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    

    运行结果

    A 取到了礼物编号 5
    B 取到了礼物编号 4
    C 取到了礼物编号 2
    D 取到了礼物编号 1
    E 取到了礼物编号 3
    

    这样写会有个小BUG,当ABCD先取到了1234,那最后一个就没得拿了

    判断最后2个礼物的情况

    为了避免前面的4个小伙伴刚好取到1234,把5留个最后一个小伙伴的尴尬情况,在还剩最后2个的时候,就做个判断会有3种情况

    • 最后2个礼物 刚好是最后2个小伙伴的,换着拿
    • 最后2个礼物 都不是最后2个小伙伴的,随便拿
    • 最后2个礼物 其中有1个是属于最后2个小伙伴的,换着拿
    import random
    '''
    交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的
    '''
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    employees = [j for j in people.keys()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 判断最后2个礼物是不是有可能拿到自己的
        if len(gifts) == 2:
            # 情况1:最后2个礼物,刚好是最后2个人的
            if people[employees[0]] in gifts and people[employees[1]] in gifts:
                if people[employees[0]] == gifts[0]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                else:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
            # 情况2:最后2个礼物,都不是最后2个人的
            elif people[employees[0]] not in gifts and people[employees[1]] not in gifts:
                print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
            # 情况3:最后2个礼物有其中一个是最后2个的
            else:
                if people[employees[0]] == gifts[0]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                elif people[employees[1]] == gifts[1]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0])) 
                else:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
    
    
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            gifts.pop(n)
            employees.remove(x)
    
    if __name__ == '__main__':
        for x in people.keys():
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    

    这样多运行几次都不会有问题了
    A 取到了礼物编号 4
    B 取到了礼物编号 5
    C 取到了礼物编号 2
    D 取到了礼物编号 1
    E 取到了礼物编号 3

  • 相关阅读:
    boost::asio发送与传输相关的几个函数,备忘
    当ASIO::ASYNC_READ与SOCKET的ASYNC_READ_SOME的区别
    boost::asio keepalive
    boost asio ——深入框架
    Boost.Asio和ACE之间关于Socket编程的比较
    OCP-1Z0-052-V8.02-15题
    JavaScript对象和数组
    Oracle 11g New 使用RMAN 增强功能
    Flex中集合的类型
    Flex中基于列表的一系列MX组件及相互关系
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14176200.html
Copyright © 2011-2022 走看看