2017-03-16 22 views
-1

问题是要找到一个数字中最大的二进制差距,虽然这在我的IDE中工作,但Codility不接受它。有什么想法吗?这个Codility Answer有什么问题?

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'吗? –

+0

它看起来不正确。正则表达式找不到重叠匹配,所以如果输入是“10010000010001”,它将返回包含最长间隔的“1001”和“10001”,但不是“1000001”。 – Barmar

+0

@HunterMcMillen基于他的代码,它似乎是一个数字的二进制表示中的1位之间的一系列0位。 – Barmar

回答

1

与您的代码的主要问题是,binary.match(re)不会返回重叠的匹配。因此,如果binary = "1010000001001",它将返回["101", "1001"],这是缺少它们之间的长距离10000001

您可以通过更改正则表达式解决这

const re = /0+1/g; 

那么你应该返回counter - 1而不是counter - 2

你并不需要把10+因为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