礼物交换算法

礼物交换算法

公司员工之间交换礼物,保证每个员工拿到的礼物不是自己的


实现方法一

思路:

  1. 给员工编号workers(list), 然后打乱workers(random.shuffe)
  2. 创建员工:自己的礼物字典{0号员工: 0号员工自己的礼物}
  3. 循环workers,然后去自己后一位索引的员工手上的礼物

实现如下:

def gifts_change(n):
    # 所有员工编号
    all_workers = range(0, n)
    # 所有员工及自己的礼物
    all_gifts = dict(zip(all_workers, all_workers))
    # 打乱员
    random.shuffle(list(all_workers))
    for i in range(n):
        # 最后一个员工拿第一个员工的礼物
        if i == n - 1:
            print({i: list(all_gifts.values())[0]})
        else:
            print({i: all_gifts[i + 1]})
            # all_gifts.pop(i + 1)

耗时

在这里插入图片描述

实现方法二

思路:

  1. 给员工编号all_workers = range(0, n),礼物编号反转all_gifts = dict(zip(all_workers, all_workers))
  2. 如果是偶数员工, 直接按下标同时遍历步骤一的两个迭代器,即为结果
  3. 如果是奇数员工,则算出中间员工编号,其与前一位员工交换礼物,其他员工同步骤二

实现如下:

def gifts_change_(n):
    all_workers = range(0, n)
    all_gifts = range(n - 1, -1, -1)
    if n % 2 == 0:
        for i in range(n):
            print({all_gifts[i]: all_workers[i]})
    else:
        mid = n // 2
        left = mid - 1
        # right = mid + 1
        for i in range(n):
            if i == left:
                print({all_gifts[left]: all_workers[mid]})
            elif i == mid:
                print({all_gifts[mid]: all_workers[left]})
            else:
                print({all_gifts[i]: all_workers[i]})

耗时

在这里插入图片描述

总结

方法二相对较快, 初步分析是range占用空间比转为list要小,且省去了转换消耗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值