作者|杰斯克森来源|达达前端小酒馆掘金|https://juejin.im/user/5a16e1...算法题目:给定一个字符串s,计算其中0和1个数相同的非空数中全0全1的(连续)子串的个数被合并。重复的子字符串计算它们的出现次数。示例1:输入:“00110011”输出:6解释:有6个连续1和0的个数相同的子串:“0011”、“01”、“1100”、“10”、“0011”、“01”.请注意,一些重复的子字符串会计算它们的出现次数。此外,“00110011”不是有效的子字符串,因为所有0(和1)都没有组合在一起。示例2:输入:"10101"输出:4解释:有4个子串,"10"、"01"、"10"、"01",连续的1和0的个数相同。注意:s.length取值范围为1到50,000,s只包含“0”或“1”字符。“000111”中有多少个有效的二进制子串,“11100”中有多少个有效的二进制子串?“00011100”呢?本题难度系数简单,涉及的知识点都是字符串。JavaScript解决方案:给定函数体:/**@param{string}s@return{number}*/varcountBinarySubstrings=function(s){};题目理解:通过看这两个例子,给定的字符串s都是二进制数,要求计算0和1的个数相同的非空(连续)子串的个数,其中有3个条件这句话:第一个不为空,第二个不为空(连续)0和1是同数第三个0和1如果连续出现的子串个数说明:如果遇到10或者01,说明continuous1orcontinuous0isbreaked,那么就可以得到前面连续1或者连续0的个数,然后再查找后面连续1或者连续0的个数,比较匹配的子串有多少。内容:类型1JavaScript:varcountBinarySubstrings=function(s){//前一个数字和当前数字letpre=0,count=0,count1=0,count2=0;//loopstringfor(leti=1;i计数2?计数2:计数1;计数1=计数2;计数2=0;前=我;}}if(i===s.length-1){count2=s.length-pre;计数+=计数1>计数2?计数2:计数1;}}returncount;}第二种JavaScript:/***@param{string}s*@return{number}*/varcountBinarySubstrings=function(s){//字符串的长度constlen=长度;//次数为0,上次为0,当前为1。让n=0,pre=0,current=1;//循环字符串for(leti=0;i0){n+=Math.min(pre.current);}pre=当前;当前=1;}}returnn;};JavaScriptmin()方法返回值:给定值中最小的数。如果任何参数无法转换为数字,则返回NaN。说明由于min是Math的静态方法,因此应该这样使用:Math.min(),而不是作为您创建的Math实例的方法(Math不是构造函数)。没有参数,结果是Infinity。如果任何参数不能转换为数字,则结果为NaN。JavaScript数学对象定义和用法min()方法返回指定数字中具有最小值的数字。Math.min.apply(null,arr)vararray=[2,6,5,8,7];Math.min.apply(空,数组);第三个JavaScript:/***@param{string}s*@return{number}*/varcountBinarySubstrings=function(s){//res存储相邻连续字符串的个数letres=[];让温度=s[0];让计数=0;for(letiofs){//循环字符串if(i!==temp){res.push(count);温度=我;计数=0;}计数++;}res.push(计数);让总计=0;for(leti=0;i=cur,就满足一次count++//里面有两个0前面,后面是1//Countcountone从0开始letcount=0//遍历字符串for(leti=1;i=cur,就可以满足一次条件if(pre>=cur){count++}}returncount};看了代码分析应该就明白了,不过这里还是声明一下,完整的条件是01或者10,也就是两者不同,计数加1,出现001或者110的时候,有两个前面一个0,后面一个1,而且前面的数大于后面的数。满足初级条件,110也是一样,1的个数为2个,0的个数为1个。那么我们定义一个变量letpre。这个变量的意思是统计前一个字符串出现的次数。首先这个变量的初始值为0,如果当前的数是1,那么就没有之前的数,也就是它的数是0。这里我们需要把当前的数量设置为1,也就是如果一个数出现,则数量为1。满足前面的数大于等于后面的数的条件,即pre>=cur时,我们统计满足条件的情况,加1,定义count为count,满足条件时count++//计算前一个字符连续出现的次数letpre=0//计算下一个字符连续出现的次数letcur=1//每当pre>=cur,条件满足一次count++//前面有两个0,后面是1//countcountonestart0letcount=0注意:计算连续出现的次数前一个字符与后一个字符连续出现次数的计算不同!然后给我们一个字符串数字,“00110011”,我们需要循环遍历这个字符串中的数字,比较前一个数字和下一个数字是否相等。如果相等,是什么情况?例如:在00或11的情况下,当前数字cur会加1。如果有不同的字符,即情况:10或01,则从0开始计算前一个字符连续出现的次数到1,它有数字,也就是开始有次数。将cur的当前个数赋值给pre(计算前一个字符连续出现的次数)。看01和10的情况,cur当前编号赋值为1。如果满足条件,有人问,那么001或110或1100或0011或111000或000111或1010的情况呢?即满足这些条件:前一个字符连续出现的次数大于等于后一个字符连续出现的次数,即满足pre>=cur的条件,则计数条件为count++。循环字符串后,返回我们需要计数的计数。总结:好了,本章到此结束,有什么不懂的欢迎在下方评论讨论!??别忘了留下学习的足迹【点赞+收藏+评论】AuthorInfo:【作者】:Jeskson【原创公众号】:达达前端小酒馆。【福利】:公众号回复“信息”,送自学资料大礼包(进群分享,想要什么就说,看我有没有)!【转载说明】:转载请注明出处,谢谢合作!~大前端开发,定位前端开发技术栈博客,PHP背景知识点,web全栈技术领域,数据结构与算法,网络原理等以通俗易懂的方式呈现给小伙伴方式。感谢您的支持,感谢您的厚爱!!!如本账号内容有问题(例如:涉及版权或其他问题),请及时联系我们进行整改,我们会尽快处理。请喜欢它!因为您的认可/鼓励是我写作最大的动力!欢迎来到达达的CSDN!这是一个有品质有态度的博客