我有类别和每个类别中的元素总数。
for example :
2 L,
2 S, and
1 P
我可以用以下16种方式排列它们。
llpss
llsps
llssp
lplss
lpsls
lslps
lslsp
lspls
lspsl
lsslp
lsspl
pllss
sllps
sllsp
slpls
slslp
在您反对列表不完整之前,您应该知道这一点 镜像被认为是等效的。
例如,因为“sspll”从后到前与“llpss”相同, 我们将它们视为一个。
您将获得一个int [],其中包含每个元素的元素数 类别(L,S,P,A,B)。返回一个int,说明他们可以的方式 排成一列,无视反思。
for example :
{2, 2, 1}
Returns: 16 // illustrated above.
{2, 2, 2}
Returns: 48
我能想到的算法非常基础:
- 将数字转换为各自的字母(L,S,P,A,B;索引0处的B)。
- 使用这些字母计算可能的总排列数
删除反射
但这当然不是最佳解决方案。任何人都可以告诉我任何其他解决方案。 感谢..
答案 0 :(得分:1)
类型( a , b , c )折扣反映的单词数量公式为:
[ (a+b+c)! / a! / b! / c! + correction ] / 2
其中更正是反射等于自己的单词数。
例如,对于(2,2,1),对于两个单词lspsl
和slpls
,校正项为2。
单词总数为(5!/ 2!/ 2!+ 2)/ 2 =(120/4 + 2)/ 2 = 32/2 = 16.
对于(1,1,1),校正项为0.对于(2,1,1),校正项也为0。修正项可以直接从数字 a , b 和 c 计算得出(作为练习留下。)