礼物交换算法
公司员工之间交换礼物,保证每个员工拿到的礼物不是自己的
实现方法一
思路:
- 给员工编号
workers(list)
, 然后打乱workers(random.shuffe)
- 创建员工:自己的礼物字典
{0号员工: 0号员工自己的礼物}
- 循环
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)
耗时
实现方法二
思路:
- 给员工编号
all_workers = range(0, n)
,礼物编号反转all_gifts = dict(zip(all_workers, all_workers))
- 如果是偶数员工, 直接按下标同时遍历步骤一的两个迭代器,即为结果
- 如果是奇数员工,则算出中间员工编号,其与前一位员工交换礼物,其他员工同步骤二
实现如下:
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要小,且省去了转换消耗