输出排列的第n个数
来源:互联网 发布:四川农大网络教育 编辑:程序博客网 时间:2024/05/18 03:03
华电北风吹
最后修改日期:2015/8/6
输入:一个整数n和一个字符串链表(默认链表已经由小到大排序好,例如[1,2,3,4,5,6],(这个主要是用来计算排列组合次序的,并不是严格的排序,但是是默认的顺序也行,例如[a,b,c,1,2,3])
输出:输入链表从最小的排列(输入排列默认是最小的)开始的第n个排列
中间使用到三个函数
def func1(x): i=1 val=1 while val<x: i+=1 val*=i if val==x: return (1,i,0) else: step=val//i k=x//step return (k,i-1,x%(k*step))
func1函数主要功能输出x的阶乘范围。例如 func1(126)返回(1,5,6)表示
def func2(x): lst=[] result=func1(x) while result[2]!=0: lst.append(result[0:2]) result=func1(result[2]) lst.append(result[0:2]) return lst
func2主要返回一个链表,把
def func3(x,clst): result=[] count=len(clst) lst=func2(x) length=len(lst) for i in range(0,length): if i<length-1: delta=lst[i][0] position=lst[i][1]+1 while count>position: result.append(clst[-count]) del clst[-count] count-=1 result.append(clst[-position+delta]) del clst[-position+delta] count-=1 else: delta=lst[i][0]-1 position=lst[i][1]+1 while count>position: result.append(clst[-count]) del clst[-count] count-=1 result.append(clst[-position+delta]) del clst[-position+delta] count-=1 while count>0: result.append(clst[-1]) del clst[-1] count-=1 return result
func3是主函数,主要调用func2返回的链表,根据选择规则在传入的字符串链表中选择出第n个排列。
测试代码:
charlist=[0,1,2,3,4,5,6,7,8,9]k=pow(10,6)print(func1(k))print(func2(k))print(func3(k,charlist))
主程序输出:
[2,7,8,3,9,1,5,4,6,0]
需要注意的是程序没有越界检测,越界会报错
0 0
- 输出排列的第n个数
- n个数的排列
- 普通递归算法:输出n个数的所有全排列
- p95 输入n个数,输出这n个数的所有排列
- 数学问题1:n排列的第k个数
- LeetCode60 n个数的排列组合找出第k个排列
- n个数的全排列
- N个数的全排列
- n个数的全排列
- N个数的全排列
- n个数的全排列
- N个数的全排列
- 输出N个数中取M个数的所有组合,排列情况
- 银行有个存有n个用户编号的文件....输出:n个数升序排列....
- n全排列输出和 n个数的组合(数字范围a~b)
- 输出前n个数组合成的第k个数
- 输出n的全排列
- 输出n的全排列
- C#中Split用法
- JS关键字和保留字小结
- 关于Flash中的黑白棋AI编写心得
- 巴勒莫中文离线地图App上线
- 重拍NBA50大
- 输出排列的第n个数
- POJ 2823单调队列 数组写法
- 进程与线程的一个简单解释
- 我的书单
- Android DownloadManager 的使用
- 链式栈的基本操作——LinkStack(C语言版)
- Android Log及其参数的使用
- ubuntu 15.04下配置ndk环境
- android观察者设计模式 下载进度同步显示