Algo用于在log(N)时间内查找连续项目

时间:2013-10-25 23:47:09

标签: c++ algorithm

有没有人对此有简明的答案?我在职业杯上看到了这个。 http://www.careercup.com/question?id=4860021380743168

给定一个整数的二进制表示,即15为1111,找到最大的最长连续序列0。 扭曲是需要在log N中完成。

例如。 10000101 答案应该是4,因为有4个连续的零。

如果您对c ++有最适合我的答案

2 个答案:

答案 0 :(得分:5)

非常简单,只需要通过二进制表示法,一次线性传递。二进制表示法的长度为log(N),因此需要log(N)时间。

答案 1 :(得分:0)

似乎这是asked before

然而,当我觉得需要喋喋不休时,我会找到无与伦比的Hackers Delight副本。事实证明,它包含对finding the longest string of 1 bits的讨论,包括可以在位/翻转(非)输入上使用的“对数”实现:

int fmaxstr0(unsigned x, int *apos) {
   // invert bits.
   x = ~x;

   unsigned x2, x4, x8, x16, y, t;
   int s;

   if (x == 0) {*apos = 32; return 0;}
   x2 = x & (x << 1);
   if (x2 == 0) {s = 1; y = x; goto L1;}
   x4 = x2 & (x2 << 2);
   if (x4 == 0) {s = 2; y = x2; goto L2;}
   x8 = x4 & (x4 << 4);
   if (x8 == 0) {s = 4; y = x4; goto L4;}
   x16 = x8 & (x8 << 8);
   if (x16 == 0) {s = 8; y = x8; goto L8;}
   if (x == 0xFFFFFFFF) {*apos = 0; return 32;}
   s = 16; y = x16;

L16: t = y & (x8 << s);
     if (t != 0) {s = s + 8; y = t;}
L8:  t = y & (x4 << s);
     if (t != 0) {s = s + 4; y = t;}
L4:  t = y & (x2 << s);
     if (t != 0) {s = s + 2; y = t;}
L2:  t = y & (x  << s);
     if (t != 0) {s = s + 1; y = t;}
L1:  *apos = nlz(y);
   return s;
}

玩得开心!