给定一个类似" 0001100001"的字符串,我需要找到最长零序列的长度(示例中为4)。
算法应该在O(log(b))时间内执行,其中b是字符串的长度。
我听说过,我必须以某种方式向左移位,以达到所需的复杂度,但我不知道为什么......
我只知道如何通过迭代字符串在线性时间内完成它。
如何获得对数时间?
答案 0 :(得分:-2)
由于数字将以字符串形式给出,我们可以使用
解析数字Integer.parseInt(String,Base)
如果我们传递说64这是二进制的1000000并且最长的0长度是6,则while循环应该运行log2(64),这是6,那么这个解决方案应该是您正在寻找的。请检查以下解决方案
public class CountZeroes {
private static long getZeroes(String s) {
int x = Integer.parseInt(s,2);
long count = 0, maxSoFar = 0;
while (x > 0) {
System.out.println("Running");
if ((x & 1) == 1) {
if (count > maxSoFar) {
maxSoFar = count;
}
count = 0;
} else {
count += 1;
}
x = x >> 1;
}
return maxSoFar;
}
public static void main(String[] args) {
System.out.println(getZeroes("10000"));
System.out.println(getZeroes("100000"));
System.out.println(getZeroes("1000000"));
}
}
我已经为16,32和64运行了这个程序,它在log(n)时间内工作,因为在这种情况下没有按字符解析字符,并且也使用了按位运算符。如果可以,请检查一次。
由于