0或1组合使得我们没有立即按顺序排列两个1

时间:2012-04-27 05:56:00

标签: c++

我的要求是代码找到两个数字的组合数量,只有0和1的X数字大小,可能从1 ... 1000变化,这样就没有时间2 1可以立即按顺序但0可能< / p>

说我们有4位数的输入

1010 1000 0000 0101 0001 0010 0100 1001 

我不确定哪个algos会生成0和1的组合?

3 个答案:

答案 0 :(得分:7)

答案由Fibonacci sequence给出。

f(n) = f(n-1) + f(n-2)

以下是前几个结果:

length     number of combinations
1          2   (0, 1)
2          3   (00, 01, 10)
3          5   (000, 001, 010, 100, 101)
4          8   (0000, 0001, 0010, 0100, 0101, 1000, 1001, 1010)

如果您认为字符串分别以“0”或“10”开头,您可以看到与Fibonacci序列有关系的原因:

  number of sequences of n digits
= number of sequences starting with 0, followed by n-1 more digits
+ number of sequences starting with 10, followed by n-2 more digits

不允许以“11”开头的序列。

如果使用适当的技术,可以非常快速地计算斐波纳契数,但是您应该意识到随着maxlen的增加,答案将会非常快速地增长。如果你想得到一个确切的答案,你需要使用一个可以处理任意大整数的库。

答案 1 :(得分:1)

一个想法是使用单词100(以及1来构建完整的字符串,但仅限于最后)。

build(sofar, maxlen):
  if len(sofar) > maxlen: return
  if len(sofar) == maxlen: found(sofar); return
  if len(sofar) == maxlen - 1: build(sofar + "1", maxlen)
  build(sofar + "10", maxlen)
  build(sofar + "0", maxlen)

此算法仅生成有效序列的证据留给您。与此算法生成所有有效序列的证明相同。

答案 2 :(得分:0)

如何将一个函数生成这些值到数组中,另一个函数只是检查数组中当前索引是否为'1'并检查下一个值是否为'1'?如果是真的,那么丢弃;否则,有效。