【问题标题】:Get Index of Combination Sequence获取组合序列索引
【发布时间】:2018-06-07 06:54:48
【问题描述】:

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

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

我全部存储在数组中,现在按顺序我们可以知道在哪个索引 发生了特殊的组合。示例:“A B C”在 6 点, “C C C”在 27 。

也可以通过索引得出它出现在哪个索引中,如 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


    【解决方案1】:

    您的组合对应于基数为 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; 例如 Line 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 等等

      【讨论】:

        猜你喜欢
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        相关资源
        最近更新 更多