如何找到一个二进制数中被1包围的连续0的长度?
例如,在10010001
中,有2个符合条件的字符串:1001和10001。
- 1001 中连续0的长度为2
- 10001 中连续0的长度为3
我使用了match函数但只返回了最后一个符合条件的字符串,即10001。
'1010001'.match(/1(0+)1$/g)
如何找到一个二进制数中被1包围的连续0的长度?
例如,在10010001
中,有2个符合条件的字符串:1001和10001。
我使用了match函数但只返回了最后一个符合条件的字符串,即10001。
'1010001'.match(/1(0+)1$/g)
console.log('1010001'.match(/10+(?=1)/g).map(function(x) {
return x.length - 1;
}));
$
是一个特殊字符,用于匹配字符串的结尾(MDN)。String#match
捕获了第一个组中的末尾 1,并且无法为 '10001' 创建第二个重叠组。请尝试使用RegExp#exec
。正则表达式是有状态的,在这种情况下,您需要为找到的每个匹配将最后一个索引向后移动一个。var re = /10+1/g;
var str = '10010001';
var matches = [];
var result;
while ((result = re.exec(str)) !== null) {
matches.push(result[0]);
re.lastIndex--;
}
console.log(matches);
首先,将所有的'1'替换为'11',然后从您的正则表达式中删除$符号。
console.log('10010001'.replace(/1/g, '11').match(/1(0+)1/g));
不要使用正则表达式,保持简单。
const maxNumberOfZeros = Math.max(...'000000101000100000'.split('1').map(str => str.length).slice(1, -1));
console.log(maxNumberOfZeros);
function solution(N) {
let s = (N >>> 0).toString(2).split('');
let max = 0;
//1 1 0 0 1 0 0 0 1 0
if(s.length > 2){
let lastDigit = s[s.length - 1];
let firstDigit = s[0];
while(lastDigit == '0'){
s.pop();
if(!s.length || s.length == 1) return 0;
lastDigit = s[s.length - 1];
}
while(firstDigit == '0'){
s.shift();
if(!s.length || s.length == 1) return 0;
firstDigit = s[0];
}
let x = s.join('').split('1').filter(i => i !== '').sort().reverse();
return x.length ? x[0].length : 0;
}
return 0;
}
RegExp
中的 $
匹配字符串的结尾。
您可以使用 Array.prototype.reduce()
和逻辑运算来将 1
和 0
作为 Boolean
进行评估,以确定序列是否与所需模式匹配。
let nums = ["1000000001010001", "0000000101", "100000000"];
let countZerosBetweenOnes = str =>
(res => ([...str].reduce((a, b, idx, arr) =>
(!!+a && !+b && arr.find((n, i) => i > idx && !!+n) && res.push(+a)
, !+a && !+b && res.length && ++res[res.length - 1], b))
, res.sort((a, b) => a - b).pop() || 0))([]);
nums.forEach(n => console.log(countZerosBetweenOnes(n)));
0000000101
失败。 - Tushar