有人对此有一个简洁的答案吗?我在职业杯上看到了这个。http://www.careercup.com/question?id=4860021380743168
给定一个整数的二进制表示,比如 15 作为 1111,找到最长的 0 连续序列。扭曲的是它需要在 log N 中完成。
例如。10000101 答案应该是 4,因为有 4 个连续的零。
如果您有 c++ 中的答案,那对我来说是最好的
有人对此有一个简洁的答案吗?我在职业杯上看到了这个。http://www.careercup.com/question?id=4860021380743168
给定一个整数的二进制表示,比如 15 作为 1111,找到最长的 0 连续序列。扭曲的是它需要在 log N 中完成。
例如。10000101 答案应该是 4,因为有 4 个连续的零。
如果您有 c++ 中的答案,那对我来说是最好的
很简单,只需通过二进制符号,一次线性传递。二进制符号有长度log(N)
,所以需要log(N)
时间。
好像以前有人问过这个问题。
然而,当我觉得需要一点点玩弄时,我会伸手去拿我的无与伦比的Hackers Delight副本。事实证明,它包含有关查找最长 1 位字符串的讨论,包括可以在此处用于位/翻转(非)输入的“对数”实现:
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;
}
玩得开心!