生成第n个长度为m的排列
public class Permutation {
private static int A(int down, int up) {
if(down < up || up <= 1) return -1;
int res = 1;
while(up-- > 0) {
res *= down--;
}
return res;
}
/**
* 获得第n个未使用的字符的下标
* @param flag 用于记录是否使用
* @param nth 第几个
* @return 下标
*/
private static int getNthUnusedIndex(boolean[] flag, int nth) {
for(int i = 0; i < flag.length; i++) {
if (!flag[i]) {
if(nth-- == 0) {
flag[i] = true;
return i;
}
}
}
return -1;
}
/**
* 获得array数组中长度为len的第n个排列
* @param array 排列字符来源
* @param len 排列长度
* @param nth 第n个
* @return mmm
*/
public static String getNthPermutation(char[] array, int len, int nth) {
if(--nth < 0) return null;
int arrLen = array.length;
int mod = A(arrLen, len);
if(nth >= mod) return null;
StringBuilder sb = new StringBuilder();
boolean flag[] = new boolean[array.length];
while(len-- > 0) {
mod /= arrLen--;
int index = getNthUnusedIndex(flag, nth / mod);
sb.append(array[index]);
nth %= mod;
}
return sb.toString();
}
}

浙公网安备 33010602011771号