https://codility.com/programmers/lessons/1-iterations/
考虑到这一点:
if (largestHole > (bin.length - i) && subHole < (bin.length - i)) {
break;
}
如果到目前为止最大孔的长度小于剩余数字的长度,则检查它是否会打破循环
此行let bin = parseInt(N, 10).toString(2);
用于将数字从基数10转换为基数2字符串,这是我迭代的内容。
function solution(N) {
let bin = parseInt(N, 10).toString(2);
let subHole = 0;
let largestHole = 0;
for (var i = 0; i < bin.length; i++) {
if (largestHole > (bin.length - i) && subHole < (bin.length - i)) {
break;
}
if (bin[i] === '0') { subHole++; }
else {
if (subHole > largestHole) {
largestHole = subHole;
}
subHole = 0;
}
}
return largestHole;
}
答案 0 :(得分:2)
仍然是O(n)。复杂性没有考虑系数。此外,O(log n)函数就像二进制搜索。
编辑: O(log n)算法的简单解释: 以二进制搜索为例。你有一个数字x,比如1到100,它隐藏在一个排序数组中,包含从1到100的n个数字。你从数组的中间开始,取决于比较中间数的大小到x,你搜索数组的左半部分或右半部分。该过程以递归方式继续,直到找到该号码。
例如我想在[1,3,5,6,7,9,10]中找到5。 我从第四名开始。它是6,它大于5,所以我们从1到5搜索左半部分。然后,我在窄范围内再次检查中间位置,即3。它小于5 ,所以我们搜索右半边。此时我们只剩下一个数字 - 即5。
搜索会将数组分成两半,因此最糟糕的情况是log 2 n(n的基数2对数)。那是一个O(log n)函数。
然而,正如我所说,复杂系数并不重要。例如,冒号排序通常需要大约(n ^ 2)/ 2圈,但我们只计算为O(n ^ 2),忽略1/2系数。
答案 1 :(得分:1)
我同意O(n)但实际上它取决于parseInt函数的实现。