【发布时间】:2017-11-06 04:17:57
【问题描述】:
如何找到二进制两端被一包围的连续零的长度?
例如,10010001 中的 2 个匹配项是 1001 和 10001
- 1001 零的长度为2
- 10001 零的长度是3
我使用了 match,它只返回最后一个,即 10001。
'1010001'.match(/1(0+)1$/g)
【问题讨论】:
标签: javascript regex
如何找到二进制两端被一包围的连续零的长度?
例如,10010001 中的 2 个匹配项是 1001 和 10001
我使用了 match,它只返回最后一个,即 10001。
'1010001'.match(/1(0+)1$/g)
【问题讨论】:
标签: javascript regex
这里需要先行断言:
console.log('1010001'.match(/10+(?=1)/g).map(function(x) {
return x.length - 1;
}));
【讨论】:
首先,将所有“1”替换为“11”,然后从正则表达式中删除 $ -。
console.log('10010001'.replace(/1/g, '11').match(/1(0+)1/g));
【讨论】:
在正则表达式中,$ 是匹配字符串结尾的特殊字符 (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);
【讨论】:
我会保持简单,而不是使用正则表达式。
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 失败。