面试题-有1、2、3、4数字能组成多少互不相同无重复数的三位数?
前言
有1、2、3、4数字能组成多少互不相同无重复数的三位数?
普通写法
这一题很多小伙伴能想到的最直接的方法是嵌套三个for循环,然后判断3个数字不相等,得到组合的情况
s = 0
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and i != k and j != k:
print(i, j, k)
s += 1
print("总过能生成的排列组合:", s)
这种方式简单粗暴,毫无美感可言,只能算勉强及格。(可能你会说我去百度搜到都是这个答案, 那就不用往下看了!)
如果数据量非常大的时候,是很消耗内存的,于是会想到生成器。
生成器解决
可以定义一个生成器,可以用for循环遍历取值。
def permutation():
"""
定义一个生成器,函数带yield就是生成器
"""
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and i != k and j != k:
yield "%s%s%s"%(i,j,k)
for i in permutation(): # 遍历
print(i)
# 也可以通过len来求长度
print(len(list(permutation())))
这里虽然用到迭代器的知识了,但上面有3个for循环,依然不太好看。
排列组合
从n个元素的集合中抽取样本容量为r的样本,重复抽样的有序样本数为:
无重复抽样的有序样本数为:
这个理解起来应该是没有难度的,比如有10个人,我现在想选3个人出来拍我马屁:
那我先从10个人里随便挑一个,这已经有10种情况了;
我再从剩下的的9个人里随便挑一个,又是9种情况;
然后我又从剩下的8个人力随便挑一个,又是8种情况;
根据乘法原理,一共有10×9×8=720种情况。
迭代工具 itertools
itertools是python内置的模块,使用简单且功能强大,里面有个 permutations 方法就是专门生成排列组合的生成器。
from itertools import combinations,permutations
# 分别打印每种排列情况
for i, j, k in permutations(['1', '2', '3', '4'], 3):
print(i, j, k)
# 计算总数
print(len(list(permutations(['1', '2', '3', '4'], 3))))
用内置方法就不用自己写生成器了。
2021年第七期《python接口自动化+测试开发》课程,4月18号开学(火热报名中!)
本期上课时间:4月18号-7月11号,每周六、周日晚上20:30-22:30