将唯一组合映射到数字

时间:2013-12-19 18:20:57

标签: string permutation

我正在努力想出一个我想到的问题的解决方案。我有26个字符的排列数,有6个可能的点,如26 ^ 6 = 308 915 776.我试图找到一种方法,以便我可以将每个数字映射到一个独特的组合,并能够从组合中来回移动数字。

An example:
1 = aaaaaa
2 = aaaaab
27 = aaaaba

是否有可能编写一个多项式时间算法,该算法可以在两者之间进行转换和/或是否有任何有效的例子来表达我的想法。

2 个答案:

答案 0 :(得分:3)

这只是我朋友的基本转换。

由于您没有指定语言,因此以下是伪代码,其中数组索引和字符串索引从0开始,赋值为:=。

如果你让'a'为0,'z'为25,那么要从base 26转换为base 10:

total:= 0
loop index from 0 to 5
  temp:= 'z' - input[index]  // Left to right. Single base 26 digit to base 10
  total:= 26 * total + temp    // Shift left and add the converted digit
  increment index and goto loop start

回到字母(基数26)也很容易:

result:= ''
loop index from 0 to 5
  temp:= 'a' + input mod 26  // Input modulus 26 is the base 26 digit to add next
  result:= temp + result  // Append current result to the new base 26 digit
  input:= input div 26  // Divide input by 26, throw away the remainder
  increment index and goto loop start

如果你想要所有的a都是1,那么在从base 26转换到base 10之后加一个并在从base 10转换到base 26之前减1.就个人而言,我会让所有a都为0。

答案 1 :(得分:1)

您可以通过指针将其映射为双精度:

char *example = "abcdef";

double d = 0;
char *p = (char *)&d;
for (int i=0; i<6; i++)
    p[i] = example[i];

// d is your code

它不是那么美丽而且不是100%允许的,但是它有效。