这个Codility答案有什么问题?

时间:2017-03-16 20:21:46

标签: javascript

问题是找到一个数字中最大的二进制间隙,虽然这在我的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));




4 个答案:

答案 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;
    
}