Python:每日一题 238(答题有奖)
本帖最后由 zltzlt 于 2019-9-22 20:39 编辑今天的题目:
给出列表 ,其所有元素共有 n! 种排列。(n! 是什么?请见 https://baike.baidu.com/item/%E9%98%B6%E4%B9%98/4437932?fromtitle=n%21&fromid=7806135)
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
1. "123"
2. "132"
3. "213"
4. "231"
5. "312"
6. "321"
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 。
提示:itertools。
示例 1:
输入: n = 3, k = 3
输出: "213"
示例 2:
输入: n = 4, k = 9
输出: "2314"
{:10_298:}欢迎大家一起答题!{:10_298:}
解法 1:
import math
def getPermutation(n, k):
digit =
res = ""
while n > 0:
tmp = math.factorial(n - 1)
idx =(k - 1) / tmp
k -= idx * tmp
res += str(digit)
digit.pop(idx)
n -= 1
return res import itertools
def func(n, k):
print( *list(itertools.permutations(, n)), sep = '') 本帖最后由 Futuresing 于 2019-9-15 21:43 编辑
from itertools import permutations
n, k = eval(input("Enter n, k: "))
def total(n):
total = 1
for i in range(1, n + 1):
total *= i
return total
if n < 1 or n > 9:
print("Invalid input!")
elif k < 0 or k > total(n):
print("Invalid input!")
else:
allPerm = list(permutations(range(1, n + 1), n))
permK = allPerm
sum = 0
for i in range(n):
sum += permK * 10 ** (n - i -1)
print(sum)临时去学了itertools模块,还请多多指教{:10_254:} >>> def fun238(n,k):
"""求由数字1~n组成的所有无重复数按升序排列后的第k个数"""
nr = list(range(1, n+1)) # 将数字1~n存进列表,好进行组合
max=0 # 我决定从能组合的最小数和最大数之间一个个找
min=0
sl = [] #存储符合要求的组合数
for i in nr:#组合出最小的数
min = min*10 + i
for i in reversed(nr):#组合出最大的数
max = max*10 + n
for i in range(min, max+1): #从最小数遍历到最大数
nr.clear() #每次循环清空组成每个数的数字列表
j = i #开始检查,检查时需要提取每位数字会改变数值
while 0<j%10<=n:#每位数字必须在1~n之间
nr.append(j%10) #将符合条件的每位数字存进列表
j //= 10 #用地板除法求商
if len(set(numbers)) == n: #这个数必须由不同数字合成,则长度必为n
sl.append(i) #将符合条件的数加入列表
return sl #返回第k个数 from itertools import permutations
def fun238(n,k):
lst=[]
for i in range(1,n+1):
lst.append(str(i))
lst_new=sorted(int("".join(i)) for i in permutations(lst,n))
return lst_new from itertools import permutations
def fun238(n,k):
list_n = sorted(list(permutations()))
return ''.join(]) 本帖最后由 永恒的蓝色梦想 于 2019-9-17 18:46 编辑
def func(n,k):
from itertools import permutations as perm
count=0
for i in perm(range(1,n+1)):
count+=1
if count==k:
return ''.join((str(j)for j in i) 新学 发表于 2019-9-16 00:45
不错,但是超时了 jdzzj 发表于 2019-9-16 10:10
输入 n = 9, k = 331987 超时 永恒的蓝色梦想 发表于 2019-9-16 19:23
通过!
执行用时:864 ms 776667 发表于 2019-9-16 16:04
输入 n = 9, k = 24479 超时 快下班了,细节就没有搞,都带着学import tkinter
import re
import itertools
import sys
def getnvalue():
n=entry1.get().strip()
return int(n)
def getkvalue():
k=entry2.get().strip()
return int(k)
def cal():
output_text=''
n=getnvalue()
k=getkvalue()
list1=[]
for i in range(1,n+1):
list1.append(i)
list2=list(itertools.permutations(list1,n))
for each in list2:
output_text+=str(each)
text1.delete('0.0','end')
text1.insert('end','所有排列序列:')
outputvalue(str(list2))
text1.insert('end','\n')
text1.insert('end','第K个数是:')
outputvalue(output_text)
def outputvalue(value):
text1.insert('end',value)
root=tkinter.Tk(className='每日一题238')
root.geometry='300×50+500+200' #geometry('width×height+x+y')
label1=tkinter.Label(root,text='n')
label1.grid(row=3,column=0)
entry1=tkinter.Entry(root,bg='green')
entry1.grid(row=3,column=1)
label2=tkinter.Label(root,text='k')
label2.grid(row=3,column=2)
entry2=tkinter.Entry(root,bg='yellow')
entry2.grid(row=3,column=3)
label3=tkinter.Label(root,text='第k个排列是')
label3.grid(row=5,column=0)
text1=tkinter.Text(root,bg='white')
text1.grid(row=5,column=1,columnspan=3)
button=tkinter.Button(root,text='分析',command=cal)
button.grid() zltzlt 发表于 2019-9-16 22:39
通过!
执行用时:864 ms
话说……如果删去数据检验是不是更快一点? 永恒的蓝色梦想 发表于 2019-9-17 18:42
话说……如果删去数据检验是不是更快一点?
from math import factorial as fact
if k>fact(n) or\
not(1<=n<=9):
raise ValueError
这一段完全可以省去。 from itertools import permutations as p
def f238(n,k):
return ''.join(list(p(,n)))
print(f238(3,3))
页:
[1]