美好的一天 .
我有一个数字字符数组 ['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
.
当零和重复出现时,它变得可变 .
More examples :https://www.codewars.com/kumite/5a26eb9ab6486ae2680000fe?sel=5a26eb9ab6486ae2680000fe
谢谢
附:更好地找到公式,我知道如何通过循环解决这个问题
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
1 回答
与'0'的唯一区别是你不能有前导'0',也就是说第一个数字不能为0 .
给定N个数组的公式变为(N - 零个数)*(N-1)!
当没有零时,它只是N! .
现在考虑重复的情况,假设数组中有K'1' . 对于之前计算中的每个排列,您可以在K中交换“1”!换句,因此你需要用K!来划分你的结果 . 这需要对具有重复的每个数字进行 . 当没有重复(0或1这样的数字)时,你除以0!还是1!因此划分不会改变 Value .
示例案例:[0,0,1,1]
4位数,2个零,2个
(4-2)* 3! /(2!* 2!)= 3
可能的排列:1001,1010,1100