Python每日一题(8)

一、题目

question=[
	"有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?"
]

二、分析

  按照一般思路,我就得就是一次循环遍历,然后输出就行。后来想考虑一下有没有别的方法,然后想到了用队列来解决,但是不知道是否可能,于是经过了下列模拟:

"""
	初始:  按照1234入队,然后每3个出队再入队
	顺序		1234	123出队	记录123	123再入队
				4123	412出队	记录412	412再入队
				3412	341出队	记录341	341再入队
				2341	123出队	记录234	234再入队
				1234	最后又回到1234了,跳出循环
				
				另
				123  312 231 
				132 213 321
"""

  分析一下记录的数据(123 、412 、341 、234),这些数字分别全排列之后的结果就应该是最终答案。所以我们可以再定义一个函数,用来统计三位数全排列后的各个数,最后将这四个记录数的全排列数统计出来就好了。三位数的全排列也可以用队列来做,看上面的另,每两个出队再入队,然后末尾两个数再互换位置,重来一遍。所以可以定义两种函数。这个方法可能比较麻烦,但是可以练习队列、数据之间整合的能力。python肯定有包能直接解决问题的,但那样并没有什么意思。另外这个题目如果上升到n阶的话,感觉需要用到递归来做。当然,现在我们不考虑复杂的,先将这个基础的做好就行。

三、自己源代码

  源代码写的比较丑陋,全是按照上面自己的思想来写的,可是总是输出不了结果,用pdb调试了一下,循环中设置断点后continue后又不动了,不知道什么情况。下面的代码不正确,仅作为了解

question=[
    """
        有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
    """
]
import queue
import pdb
q=queue.Queue(maxsize=4)
temp=[]
for i in range(1,5):
    q.put(i)
# pdb.set_trace()
for _ in range(4):
    m=q.get()
    n=q.get()
    b=q.get()
    temp.append((m,n,b))
    q.put(m)
    q.put(n)
    q.put(b)
#此时temp中存储的是4个三位数
def get_answer(l):
    temp=queue.Queue(maxsize=6)
    result=[]
    for m,n,b in l:
        result.append(m*100+n*10+b)
        temp.put(m)
        temp.put(n)
        temp.put(b)
        m=temp.get()
        n=temp.get()
        temp.put(m)
        temp.put(n)
        result.append(b*100+m*10+n)
        b=temp.get()
        m=temp.get()
        temp.put(b)
        temp.put(n)
        result.append(n*100+b*10+m)
        pdb.set_trace()
    for m,b,n in l:
        result.append(m*100+n*10+b)
        temp.put(m)
        temp.put(n)
        temp.put(b)
        m=temp.get()
        n=temp.get()
        temp.put(m)
        temp.put(n)
        result.append(b*100+m*10+n)
        b=temp.get()
        m=temp.get()
        temp.put(b)
        temp.put(n)
        result.append(n*100+b*10+m)
    return result
l=get_answer(temp)
print(l)



四、deepseek答案

  它直接用了python内置的包来解决。怎么说呢,这样虽然非常快,但是缺少对应过程的思考,如果换做某语言你不了解这个包,而且没有对应思想,肯定做不了的。当然这样也明确为什么学习数据结构时,本来各种结构(链表、队列等等)都有内置方法,可是老师讲的确仍是初等的构建,我想还是一个道理,用别人搭建好的框架,没有自己思考,万一以后遇到某种问题,不知道别人构建的框架,也没有自己的想法,肯定还是做不了的。

import itertools

# 四个数字
digits = [1, 2, 3, 4]

# 生成所有3位数的排列组合(不重复)
permutations = list(itertools.permutations(digits, 3))

# 将排列转换为整数
numbers = [p[0] * 100 + p[1] * 10 + p[2] for p in permutations]

# 输出结果
print(f"共有 {len(numbers)} 个符合条件的三位数,分别是:")
print(numbers)

五、总结

  今天抽空看看对应排列组合的算法,了解一下解决方式再来修改一下自己的代码吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值