美好的一天。
我有一组数字字符['9','0']
或['9','5','2','0','0','0']
。需要查找长度等于源数组生成的数组大小的所有自然数的数量。例如['9','0']
仅90
,答案为1
。
如果数组没有0且数字重复数量可以通过阶乘计算:
['5','7','2'] => 3! => 6
['1','2','3','4','5','6','7'] => 7! => 5040
。
当出现零和重复时,它变得可变。
更多示例:https://www.codewars.com/kumite/5a26eb9ab6486ae2680000fe?sel=5a26eb9ab6486ae2680000fe
谢谢
P.S。更好地找到公式,我知道如何通过循环解决这个问题
def g(a)
answer = a.permutation(a.size)
.select{|x| x.join.to_i.to_s.split("").size == a.size }.to_a.uniq.size
answer
end
答案 0 :(得分:2)
与' 0'的唯一区别是你不能有领先' 0,即第一个数字不能为0。
给出N个数组的公式变为 (N - 零个数)*(N-1)!
当没有零时,它只是N!。
现在考虑复制的情况,假设有K' 1'在数组中。对于您在之前计算中的每个排列,您可以交换' 1'在K!换句,因此你需要用K!来划分你的结果。需要对具有重复项的每个数字进行此操作。当没有重复(0或1这样的数字)时,你除以0!还是1!因此,分裂不会改变价值。
示例案例:[0,0,1,1]
4位数,2个零,2个
(4-2)* 3! /(2!* 2!)= 3
可能的排列:1001,1010,1100