获取组合序列索引

问题描述 投票:3回答:2

我在下面的模式中生成了三个字母的可能组合,如(A,B,C)。修复外部字母并更改内部。

对于(A,B,C)= 3 * 3 * 3的可能性。

我将所有数据存储在数组中,现在按顺序可以知道在哪个索引中发生了特定的组合。例如:6处的“A B C”,27处的“C C C”。

同样通过索引可以得出它看起来像6 =“A B C”的索引。

有什么模式可以找到吗?不期望代码只有公式

A A A
A A B
A A C

A B A
A B B
A B C

A C A
A C B
A C C

B A A
B A B
B A C

B B A
B B B
B B C

B C A
B C B
B C C

C A A
C A B
C A C

C B A
C B B
C B C

C C A
C C B
C C C
java c algorithm math
2个回答
3
投票

您的组合对应于base-3数字,它们使用字母ABC作为其数字:

  • A对应0
  • B对应1
  • C对应2

如果将索引转换为base-3,则会得到相应的组合。您从1开始编号组合,因此您需要在转换前减去1。

例如,要使第6行的组合减去1得到5,然后将5转换为base-3得到012,然后用字母替换数字以获得ABC。

同样,您可以将组合转换为base-3,例如CAB变为201,然后将其转换为十进制以获得19,添加1以获得20 - 列表中的CAB索引。


2
投票

让我们看一下A和B的简单案例

你会得到

AA
AB
BA
BB

但等等 - 就像二进制一样

00
01
10
11

那么在这种情况下如何 - 如果我们将编写行,我们将获得:

1 = AA
2 = AB
3 = BA
4 = BB

所以它就像一行的二进制表示 - 1;例如,线2 => 2-1 = 1 => 1,二进制是01 => AB

所以事实上你应该做同样但不是二元,但三元(是一个单词?) - 意味着你的例子中的索引为3

最右边的'数字'是字母大小(在你的例子中为3),功率为0,下一个是字母大小,功率为1

所以 - CAC => 2 * 3 ^ 2 + 0 * 3 ^ 1 + 2 * 3 ^ 0 = 18 + 0 + 2 = 20(+1来确定线从0开始)= 21等

© www.soinside.com 2019 - 2024. All rights reserved.