鱼C论坛

 找回密码
 立即注册
查看: 3167|回复: 14

[技术交流] Python:每日一题 238(答题有奖)

[复制链接]
发表于 2019-9-15 20:20:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-9-22 20:39 编辑

今天的题目:


给出列表 [1,2,3,…,n],其所有元素共有 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 的范围是 [1, 9]。


提示:itertools。


示例 1:

输入: n = 3, k = 3
输出: "213"
示例 2:

输入: n = 4, k = 9
输出: "2314"



欢迎大家一起答题!


解法 1:

  1. import math
  2. def getPermutation(n, k):
  3.     digit = [i for i in range(1, n + 1)]
  4.     res = ""
  5.     while n > 0:
  6.         tmp = math.factorial(n - 1)
  7.         idx =  (k - 1) / tmp
  8.         k -= idx * tmp
  9.         res += str(digit[idx])
  10.         digit.pop(idx)
  11.         n -= 1
  12.     return res
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-15 21:37:00 | 显示全部楼层
  1. import itertools
  2. def func(n, k):
  3.     print( *list(itertools.permutations([i for i in range(1, n + 1)], n))[k - 1], sep = '')
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-15 21:38:33 | 显示全部楼层
本帖最后由 Futuresing 于 2019-9-15 21:43 编辑
  1. from itertools import permutations

  2. n, k = eval(input("Enter n, k: "))

  3. def total(n):
  4.     total = 1
  5.     for i in range(1, n + 1):
  6.         total *= i
  7.     return total
  8.         
  9. if n < 1 or n > 9:
  10.     print("Invalid input!")
  11. elif k < 0 or k > total(n):
  12.     print("Invalid input!")
  13. else:
  14.     allPerm = list(permutations(range(1, n + 1), n))

  15. permK = allPerm[k - 1]

  16. sum = 0
  17. for i in range(n):
  18.     sum += permK[i] * 10 ** (n - i -1)
  19. print(sum)
复制代码
临时去学了itertools模块,还请多多指教

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1 不错

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 00:45:11 | 显示全部楼层
  1. >>> def fun238(n,k):
  2.         """求由数字1~n组成的所有无重复数按升序排列后的第k个数"""
  3.         nr = list(range(1, n+1)) # 将数字1~n存进列表,好进行组合
  4.         max=0 # 我决定从能组合的最小数和最大数之间一个个找
  5.         min=0
  6.         sl = [] #存储符合要求的组合数
  7.         for i in nr:  #组合出最小的数
  8.                 min = min*10 + i
  9.         for i in reversed(nr):  #组合出最大的数
  10.                 max = max*10 + n
  11.         for i in range(min, max+1): #从最小数遍历到最大数
  12.                 nr.clear() #每次循环清空组成每个数的数字列表
  13.                 j = i #开始检查,检查时需要提取每位数字会改变数值
  14.                 while 0<j%10<=n:#每位数字必须在1~n之间
  15.                         nr.append(j%10) #将符合条件的每位数字存进列表
  16.                         j //= 10 #用地板除法求商
  17.                 if len(set(numbers)) == n: #这个数必须由不同数字合成,则长度必为n
  18.                         sl.append(i) #将符合条件的数加入列表
  19.                
  20.         return sl[k-1] #返回第k个数
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 10:10:19 | 显示全部楼层
  1. from itertools import permutations

  2. def fun238(n,k):
  3.     lst=[]
  4.     for i in range(1,n+1):
  5.         lst.append(str(i))
  6.     lst_new=sorted(int("".join(i)) for i in permutations(lst,n))
  7.     return lst_new[k-1]
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 16:04:20 | 显示全部楼层
  1. from itertools import permutations

  2. def fun238(n,k):
  3.     list_n = sorted(list(permutations([i for i in range(1,n+1)])))
  4.     return ''.join([str(i) for i in list_n[k-1]])
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 19:23:14 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-9-17 18:46 编辑
  1. def func(n,k):
  2.         from itertools import permutations as perm
  3.         count=0
  4.         for i in perm(range(1,n+1)):
  5.                 count+=1
  6.                 if count==k:
  7.                         return ''.join((str(j)for j in i)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-16 22:36:51 | 显示全部楼层

不错,但是超时了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-16 22:38:09 | 显示全部楼层

输入 n = 9, k = 331987 超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-16 22:39:02 | 显示全部楼层

通过!
执行用时:864 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-16 22:39:51 | 显示全部楼层

输入 n = 9, k = 24479 超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-17 08:40:49 | 显示全部楼层
快下班了,细节就没有搞,都带着学
  1. import tkinter
  2. import re
  3. import itertools
  4. import sys

  5. def getnvalue():
  6.     n=entry1.get().strip()
  7.     return int(n)
  8. def getkvalue():
  9.     k=entry2.get().strip()
  10.     return int(k)
  11. def cal():
  12.     output_text=''
  13.     n=getnvalue()
  14.     k=getkvalue()
  15.     list1=[]
  16.     for i in range(1,n+1):
  17.         list1.append(i)
  18.     list2=list(itertools.permutations(list1,n))
  19.     for each in list2[k-1]:
  20.         output_text+=str(each)
  21.     text1.delete('0.0','end')
  22.     text1.insert('end','所有排列序列:')
  23.     outputvalue(str(list2))
  24.     text1.insert('end','\n')
  25.     text1.insert('end','第K个数是:')  
  26.     outputvalue(output_text)
  27. def outputvalue(value):
  28.    
  29.     text1.insert('end',value)
  30. root=tkinter.Tk(className='每日一题238')
  31. root.geometry='300×50+500+200'   #geometry('width×height+x+y')

  32. label1=tkinter.Label(root,text='n')
  33. label1.grid(row=3,column=0)
  34. entry1=tkinter.Entry(root,bg='green')
  35. entry1.grid(row=3,column=1)
  36. label2=tkinter.Label(root,text='k')
  37. label2.grid(row=3,column=2)
  38. entry2=tkinter.Entry(root,bg='yellow')
  39. entry2.grid(row=3,column=3)
  40. label3=tkinter.Label(root,text='第k个排列是')
  41. label3.grid(row=5,column=0)
  42. text1=tkinter.Text(root,bg='white')
  43. text1.grid(row=5,column=1,columnspan=3)
  44. button=tkinter.Button(root,text='分析',command=cal)
  45. button.grid()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-17 18:42:42 | 显示全部楼层
zltzlt 发表于 2019-9-16 22:39
通过!
执行用时:864 ms

话说……如果删去数据检验是不是更快一点?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-17 18:43:44 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-9-17 18:42
话说……如果删去数据检验是不是更快一点?
  1. from math import factorial as fact
  2.         if k>fact(n) or\
  3.                 not(1<=n<=9):
  4.                 raise ValueError
复制代码


这一段完全可以省去。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-23 23:55:11 | 显示全部楼层
  1. from itertools import permutations as p
  2. def f238(n,k):
  3.     return ''.join(list(p([str(i) for i in range(1,n+1)],n))[k-1])
  4. print(f238(3,3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表