将查找生日相同人员的Python代码中while循环改写为for循环的问题
实现方案
根据鸽巢原理,最多抽取366人必然会出现生日重复的情况,因此可以固定for循环的遍历范围,实现代码如下:
优化版本(用set提升查询效率)
import random def findSameBDay(): birthdays = set() # 遍历范围1~366覆盖所有可能的场景 for count in range(1, 367): birthday = random.randint(1, 365) if birthday in birthdays: return count birthdays.add(birthday) return 366
与原实现逻辑完全对齐版本(用list存储生日)
import random def findSameBDay(): birthdays = [] for count in range(1, 367): birthday = random.randint(1, 365) if birthday in birthdays: return count birthdays.append(birthday) return 366
逻辑说明
- 两段代码的运行结果和原while实现完全等价,返回值都是首次出现重复生日时的总人数
- 用
set存储生日的版本查询复杂度为O(1),比列表版本的O(n)性能更高,适合高频调用场景 - for循环的上限设为366完全符合逻辑,理论上不会走到最后的默认返回语句,仅作为语法补全保留
内容的提问来源于stack exchange,提问作者Mind Freak
相关产品推荐
相关产品推荐

