【题意说明】
1~N这N个数字,共有N!种排列顺序!并按字典序对其编号。问题:
(1)若给定的是一个排列顺序,求其编号;
(2)若给定编号,求其排列!
【问题分析】
此题我处理的很不好!关键是问题(1)处理的不好!
对于问题(2),
(1)先预处理a[i]=i!,并令k=1;
(2)从a[n]开始找到第1个比编号x小的位置j,从第k位到n-j-1位置的值依次从小到大选择未使用的数字;
(3)对于第n-j这个位置,看x/a[j]的值,再剩下未用的数中选择第x/a[j]大的数;
(4)令k=n-j+1; x%=a[j];按步骤(2)~(4)再处理x;
(5)当x==0时结束。
这样就找到满足问题(1)所要求的结果了!
对于问题(1),我采用的笨办法是,把问题(1)转换成问题(2),怎么转换的呢!!就是从1~n!,按二分法求出中间数mid,对于这个中间数按问题(2)的方法求出结果,与问题(1)的数据比较,直到找到结果!这里费时太多了!
其实可以借鉴问题(2)的思路,反过来求就可以了:
(1)令k=1;s=1;(k为位置,s为编号)
(2)从k位开始,比较其位置是否对应每个未使用的第k小数,直到不相同;
(3)计算第k位置的数是剩下数中第x大的数,s+=x*a[n-k];
(4)继续对后面的位置按步骤(2)~步骤(4)比较,直到所有的位置都比较完成!
以上对于问题(1)只是思路,程序没有实现(有些懒了!!)