Python每日一题 2025.3.28
一、题目
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)
五、总结
今天抽空看看对应排列组合的算法,了解一下解决方式再来修改一下自己的代码吧。