谷歌采访,可以有人确认这个位串算法,纯粹的假设

时间:2015-03-25 02:22:38

标签: algorithm

这是一个谷歌问题,我没有弄清楚是对还是错,但第二意见从未受到伤害。但问题是"给定一个n长度的位串求解次数" 111"出现在所有可能的组合中。"

现在我知道发现总组合是2 ^ n让我遇到麻烦的是弄清楚我确实在事件中找到了一个模式但是谁知道当n变得很大时会发生什么。

我的逻辑解决方案是

#Level (n length)   # combos   # strings with "111" in it
_________________   ________   _____________________________
0                   0          0
1("1" or "0")       2          0
2("11","01" etc.    4          0
3                   8          1("111")
4                   16         3
5                   32         8
6                   64         20
------------------------------------Everything before this is confirmed
7                   128        49
8                   256        119
9                   512        288
10                  1000       696

等。我可以发布我如何想出神奇的仙尘,但是是的

1 个答案:

答案 0 :(得分:2)

我可以帮助您解决问题:

调用函数计算字符串数,其中n位包含111是f(n)

  • 如果字符串的第一位为0,我们有f(n) += f(n - 1)//0 + (n - 1 bits)
  • 如果字符串的第一位是1,我们有f(n) += f(n - 2) + f(n - 3) + 2^(n - 3)

案例第一位的更多解释是1

如果第一位是1,我们有三种情况:

  • 10 + (n - 2 bits) = f(n - 2)
  • 110 + (n - 3 bits) = f(n - 3)
  • 111 + (n - 3 bits) = 2^(n - 3)因为我们可以采取所有组合。

总共f(n) = f(n - 1) + f(n - 2) + f(n - 3) + 2^(n - 3)

申请我们的例子:

n = 4 -> f(4) = f(3) + f(2) + f(1) + 2^1 = 1 + 0 + 0 + 2 = 3;
n = 5 -> f(5) = f(4) + f(3) + f(2) + 2^2 = 3 + 1 + 0 + 4 = 8;
n = 6 -> f(6) = f(5) + f(4) + f(3) + 2^3 = 8 + 3 + 1 + 8 = 20;
n = 7 -> f(7) = f(6) + f(5) + f(4) + 2^4 = 20 + 8 + 3 + 16 = 47;
n = 8 -> f(8) = f(7) + f(6) + f(5) + 2^5 = 47 + 20 + 8 + 32 = 107;
n = 9 -> f(9) = f(8) + f(7) + f(6) + 2^6 = 107 + 47 + 20 + 64 = 238;