1234无重复三位数python_python - 简单算法题 - 求三位数组合

求三位数组合

lst = [3, 6, 2, 7] 

这四个数字能组成多少个互不相同且无重复数字的三位数?比如362算一个,326算一个,请逐个输出他们

思路分析

从4个数里面取3个数,且不重复,然后进行拼接,做3个for循环加判断不相等即可。

与排列组合相同,取三个数,不放回,并且有顺序。

1bd0ae57b63e3715c5d712c9da1e3b8d.png

种取法可能。(题目特殊,lst各不相同,若有相同需要先在重复中二选一

,但对于结果输出不影响,只是增加取法可能)

示例代码

lst = [3, 6, 2, 7]
for i in lst:
    for j in lst:
        for k in lst:
            if i != j and j != k and k!=i:
                print(int(str(i)+str(j)+str(k))

判断方式还可以是:

if i not in (j,k) and j !=k: 

分析时间复杂度

在时间复杂度上面 n = 4,有3个for循环。

第一个for循环中f(n)=n

第二个for循环中f(n)=n^2

第三个for循环中f(n)=n^3

该算法的为 n^3+n^2+n

推导大O阶方法:

# 1、用常数1取代运行时间中的所有加法常数 
n^3 + n^2 + 1 #

#2、在修改后的运行次数函数中,只保留最高阶项 
n^3 

# 3、如果最高阶项存在且不是1,则去除与这个项相乘的常数 
n^3 

故最终时间复杂度O(n) = n^3

优化思考

第二个for循环和第三个for循环,最终要取的数据都是与第一个for循环取得不同,那么我们在循环过程中直接建立取数方法。比如第1位数被取了之后,第二个for循环只用从剩下的数据当中取数即可。

代码示例

lst = [3, 6, 2, 7]
for a in lst:
    tmp = lst.copy()
    tmp.remove(a)
    for b in tmp:
        tmp2 = tmp.copy()
        tmp2.remove(b)
        for c in tmp2:
            print(a*100 + b*10 + c)

这样子反而空间复杂度增加了,语句变得冗余。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值