生成组合行 使用通用符号

问题描述

我不知道我应该如何表述这个问题,但我希望我能解释我想要达到的目标。

所以我得到了一组字符 [A,B,C]。

我想生成包含 [A,C] 的所有可能组合所需的长度为 N 的最少行数。

示例:当 N = 4 时,它会生成类似这样的 9 行长度 N(1 列 = 1 行)

AAABBBCCC
ABCCABBCA
BACACBCBA
ABCABCABC

例如第一行 [A,A,A] 包含以下组合(1 列 = 1 组合),注意组合如何环绕行。

A,B 
A,A 
A,A 
B,A 

如何允许组合在所有生成的行中出现超过 1 次,但应保持在最佳最小值。

我应该如何以编程方式解决这个问题?

解决方法

您在计算 base 3 吗?用数字 1,2,3 而不是 0,1,2。

如果您不知道如何以三为基数进行计数,那么现在就开始吧。 0,10,11,12,20,21,22,100

如果您想知道 N 位数的行数是多少,那么答案是 3^N

如果您想知道在排序列表中给定位置(第一个位置为零)的给定长度的给定行中的序列,您可以使用以下函数

def row(k,N):
    d = []
    assert(k < 3**N)
    for _ in range(N):
        k,r = divmod(k,3)
        d.append(r+1)
    return ''.join(str(di) for di in d[::-1])

易于验证的 row(1,3)='112' 是长度为 3 的行中的第二项。 一个不太容易验证的是,长度为 25 的第 10 亿项由 row(10**9-1,25)='1111113231311311132121111' 给出。

使用通用符号

如果你想返回一个任意对象的列表(不一定是三个),它只是改变了输出的映射方式。

def row(k,symbols,N):
    d = []
    B = len(symbols)
    assert(k < B**N)
    for _ in range(N):
        k,B)
        d.append(symbols[r])
    return d[::-1];

使用它

print(row(1,['red','green','blue'],6))
print(row(100,6))
> ['red','red','green']
> ['red','blue','green']

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...