面试题-有1、2、3、4数字能组成多少互不相同无重复数的三位数?

2021-04-09 17:08:52 浏览数 (1)

前言

有1、2、3、4数字能组成多少互不相同无重复数的三位数?

普通写法

这一题很多小伙伴能想到的最直接的方法是嵌套三个for循环,然后判断3个数字不相等,得到组合的情况

代码语言:javascript复制
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循环遍历取值。

代码语言:javascript复制
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 方法就是专门生成排列组合的生成器。

代码语言:javascript复制
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))))

用内置方法就不用自己写生成器了。

0 人点赞