如何找到二进制两端包围的连续零的长度?
例如,在10010001
中,2个匹配项为1001和10001
我使用了仅返回最后一个的匹配,即10001。
'1010001'.match(/1(0+)1$/g)
答案 0 :(得分:3)
你需要先行断言:
console.log('1010001'.match(/10+(?=1)/g).map(function(x) {
return x.length - 1;
}));
答案 1 :(得分:1)
首先,将所有'1'替换为'11',然后从正则表达式中删除$ - 。
console.log('10010001'.replace(/1/g, '11').match(/1(0+)1/g));
答案 2 :(得分:1)
在正则表达式中,import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
private EditText editText,editText2;
private Button button;
private TextView luasbangundatar,kelilingbangundatar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText2= (EditText) findViewById(R.id.editText2);
button = (Button) findViewById(R.id.button);
luasbangundatar = (TextView) findViewById(R.id.luasbangundatar);
kelilingbangundatar = (TextView) findViewById(R.id.kelilingbangundatar);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
String edt1 = editText.getText().toString().trim();
String edt2 = editText2.getText().toString().trim();
int formula1 = Integer.parseInt(edt1)*Integer.parseInt(edt2);
int formula2 = (2*Integer.parseInt(edt1))+(2*Integer.parseInt(edt2));
luasbangundatar.setText("Luas Dari Bangun Datar :"+String.valueOf(formula1));
kelilingbangundatar.setText("Keliling Dari Bangun Datar:"+String.valueOf(formula2));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
是与字符串末尾匹配的特殊字符(MDN)。
但这只是问题的一半。 $
捕获了第一组中的尾随1,无法为' 10001'创建第二个重叠组。请尝试使用RegExp#exec
。正则表达式是有状态的,在这种情况下,您将要为您找到的每个匹配将最后一个索引移回一个。
String#match
答案 3 :(得分:0)
不要使用正则表达式,我会保持简单。
const maxNumberOfZeros = Math.max(...'000000101000100000'.split('1').map(str => str.length).slice(1, -1));
console.log(maxNumberOfZeros);
答案 4 :(得分:0)
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;
}
答案 5 :(得分:-1)
$
内的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)));