面试题-有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个人出来拍我马屁:

  1. 那我先从10个人里随便挑一个,这已经有10种情况了;

  2. 我再从剩下的的9个人里随便挑一个,又是9种情况;

  3. 然后我又从剩下的8个人力随便挑一个,又是8种情况;

  4. 根据乘法原理,一共有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

(0)

相关推荐