集合[1,2,3,…,n]一共有n!种不同的排列
按字典序列出所有的排列并且给这些排列标上序号
我们就会得到以下的序列(以n=3为例)
- "123"
- "132"
- "213"
- "231"
- "312"
- "321"
现在给出n和k,请返回第k个排列
注意:n在1到9之间
思路:每一位都是有顺序的,第k个排列,那么就是k/(n-1)的阶乘,然后 商 或 商+1 (取决于有没有余数,有余数就+1)就是第几个数字,然后 余数 或者 (n-1)的阶乘 继续循环求结果。
package main
import "strconv"
/**
*
* @param n int整型
* @param k int整型
* @return string字符串
*/
func getPermutation( n int , k int ) string {
// write code here
multiList := make([]int, n)
multiMap := make(map[int]int)
multiList[0] = 1
multiMap[1] = 1
for i := 2; i <= n; i++ {
multiList[i-1] = i * multiList[i-2]
multiMap[i] = 1
}
retStr := ""
for i := n; i > 1; i-- {
num := k / multiList[i-2]
k = k % multiList[i-2]
if k != 0 {
num++
} else {
k = multiList[i-2]
}
var j = 1
for j = 1; j <= n; j++ {
if multiMap[j] == 1 {
num--
}
if num == 0 {
break
}
}
multiMap[j] = 0
retStr += strconv.Itoa(j)
}
for j := 1; j <= n; j++ {
if multiMap[j] == 1 {
retStr += strconv.Itoa(j)
}
}
return retStr
}