计算二进制字串

![4646598ce4f12f0f484da18acbd83813.png](en-resource://database/11364:1)
![1226f6e4e21ed6df41356aa6e9e857c0.png](en-resource://database/11366:1)
遇到难度较大的题目的解题步骤

**1. 找规律**
从输入输出的关系来寻找规律
在题目中所给的案例中,按照顺序将所有的输入输出写出来(一个输入对应一个输出)
![019f877d62a59f95028863f3deaaf7cb.png](en-resource://database/11368:1)
从图中的输入输出可以看出
第一个输出是对输入从0位开始找子串
第二个输出是对输入从1位开始重复找子串
第三个输出是对输入从2位开始重复找子串
....
由于输入是动态的,而且还是有规律的,每次都是往后移动一位,所以使用for循环或者递归来解决问题
由于每次都是重复找子串,所以找子串是一个公共行为,可以将其抽出来
通过以上分析可以得出程序的编写分为两步:
1:外层循环控制每次输入从第几位开始
2:寻找子串
     2.1 寻找子串
     2.2 将子串保存并输出

![df153cdd0deefa315333986462be95b1.png](en-resource://database/11370:1)

代码如下:

function substr(str) {
	let r = []
	let match = (str) => {
		// 1.2.1 首先找到连续的0或者1(+表示大于等于1个)
		let j = str.match(/^(0+|1+)/)[0]
		// 1.2.2 将找到的0或者1取反(j[0] ^ 1)转换成字符类型,repeat(j.length)表示重复多少次,例如:a.repeat(6)的结果为aaaaaa
		let o = (j[0] ^ 1).toString().repeat(j.length)
		//1.2.3 创建正则对象,传入上面创建的j和o,验证传入的字符串是否有匹配我们创建的正则对象的结果
		// 如果匹配,则返回匹配的结果,
		// 否则返回空
		let reg = new RegExp(`^(${j}${o})`)
		if (reg.test(str)) {
			return RegExp.$1
		} else {
			return ''
		}
	}
// 1. 先写出循环伪代码
//1.1 外层的for循环控制第一个查找点的位置
// 因为从前面的分析中每次循环都是往右移动一位的,具有重复性,所以使用递归或者for循环
for (let i = 0, len = str.length - 1; i < len; i ++) {
	// 1.2 match的作用是只负责找出子串,其余什么都不做
	let sub = match(str.slice(i))
	// 1.3 将找出的结果保存在数据结构中
	if (sub) {
		r.push(sub)
	}
	
}
return r
}
console.log(substr('00110011'))

 

你可能感兴趣的:(计算二进制字串)