问题是找到一个数字中最大的二进制间隙,虽然这在我的IDE中有效,但Codility并不接受它。有什么想法吗?
const biGap = (number) => {
const binary = number.toString(2)
const re = /1(0+)1/g;
const found = binary.match(re)
let counter = 0
found.map((match) => {
if (match.length > counter) {
counter = match.length
}
})
return (counter - 2);
}
console.log(biGap(1041));

答案 0 :(得分:1)
您的代码的主要问题是binary.match(re)
不会返回重叠匹配。因此,如果binary = "1010000001001"
,它将返回["101", "1001"]
,这会错过它们之间的长差距10000001
。
您可以通过将正则表达式更改为
来解决此问题const re = /0+1/g;
然后您应该返回counter - 1
而不是counter - 2
。
您无需在1
的两侧放置0+
,因为number.toString(2)
永远不会包含前导零,因此左侧始终有1
任何一串零,并没有必要明确地匹配它。
如果您还希望在数字的低位中包含二进制间隙,则可以将正则表达式更改为:
const re = /0+/g;
然后在返回时不需要从counter
中减去任何内容。
const biGap = (number) => {
const binary = number.toString(2)
const re = /0+1/g;
const found = binary.match(re)
let counter = 0
found.map((match) => {
if (match.length > counter) {
counter = match.length
}
})
return (counter - 1);
}
console.log(biGap(1041));
console.log(biGap(parseInt("1010000001001", 2))); // Your code returns 2
答案 1 :(得分:0)
function binGap(N) {
var max=0;
var count=0;
var binary = Number(N).toString(2);;
Array.prototype.forEach.call(binary,function(i) {
if(i == 0) {
count++;
} else {
if(count > max) {
max = count;
}
count = 0;
}
});
return max;
}
答案 2 :(得分:0)
对于初学者,请确保正则表达式返回所有正确的候选对象
map运算符使用错误的方式。减少是您使用的方式
您不应在返回时从计数器中减去2,而应在reduce回调中这样做
不要console.log
最后想一想,为什么将数字转换为字符串?为什么不使用模2?它更简单有效。 (考虑正则表达式需要多少资源)
答案 3 :(得分:0)
可能的解决方法是这个
solution(N) {
while(N && N%2 === 0) {
N = N>>1
}
let counter = 0;
let tempCounter = 0;
let n=N;
while(n) {
if(n%2 === 1) {
counter = Math.max(counter, tempCounter);
tempCounter=0;
} else {
tempCounter = tempCounter + 1;
}
n = n>>1;
}
return counter;
}