一道百度前端线上笔试题

要求:  

输入两个字符串    strA   长度 1-50  只能包含 0或者1

           strB   长度 1-5    可以包含 0或1或?   (? 代表    0  或者 1)  

例如

strA = '1000100';
strB = '1?';    //strB 可能是  10  也可能是  11 
fun(strA,strB);  //===>输出 2   (就是从头到尾 遍历strA     返回   包含  10 或 11  的个数 )

小生不才,方法可能有点笨,下面是我写的程序(笔试当场 并没有写出这么多,字符串包装类的方法,总记混。。。。)

   var strA = '10101101';
    var strB = '?????';



    function fun(strA, strB) {
      var arrB = [];      //存储strB的所有可能
      var newArr = [];    //当出现?时  用来临时存储的 数组
      var num = 0;        //记录是不是第一次
      var acc = 0;        //记录匹配的总次数
      var len = strB.length;    //strB长度      并且最后strA 包装类substr方法中  截取长度  
      var regA = /^[01]{1,50}$/g;     //检测 strA 是否匹配
      var regB = /^[01?]{1,5}$/g;    //检测 strB 是否匹配


      //检测  输入的  strA 和  strB 是否比配
      if (!regA.test(strA)) {
        console.log('strA 格式 不匹配');
        return
      }else{
        console.log('strA:'+strA);
      }
      if (!regB.test(strB)) {
        console.log('strB 格式不匹配');
        return;
      }else{
        console.log('strB:'+strB);
      }


      //得到arrB存储 strB 的所有可能
      for (var i = 0; i < strB.length; i++) {
        if (strB.charAt(i) === '?' && num === 0) {    //如果 匹配strB第一位是   ? 添加两个    到arrB   例如 1?   2?
          num++;
          var reg = new RegExp('^([01]{' + i + '})([?]{1})([01?]*)$', 'g');
          // console.log(reg);
          arrB.push(strB.replace(reg, function (a, $1, $2, $3) {
            return $1 + '1' + $3;
          }));
          arrB.push(strB.replace(reg, function (a, $1, $2, $3) {
            return $1 + '0' + $3;
          }));

          // console.log(arrB);
          // strB.replace(/ /,1);
          // arrB.push
        } else if (strB.charAt(i) === '?' && num !== 0) {   //当匹配的不是第一次的时候  arrB 里面 一定有值的时候   遍历数组  中的每一位,
                                                            //替换数组中每一位 i 位置?       newArr向数组中push   例如  00 01 10 11  四维  

          var reg = new RegExp('^([01]{' + i + '})([?]{1})([01?]*)$', 'g');

          arrB.forEach(val => {
            // console.log(val);
            newArr.push(val.replace(reg, function (a, $1, $2, $3) {
              return $1 + '1' + $3;
            }));
            newArr.push(val.replace(reg, function (a, $1, $2, $3) {
              return $1 + '0' + $3;
            }));
          });

              //arrB存储  所有strB的可能    始终用  arrB 存储全部可能   这里  将  newArr克隆给  arrB    然后给newArr  赋值一个空  下一次  ? 时还用他
          for (var j = 0; j < newArr.length; j++) {
            arrB[j] = newArr[j];
          }
          newArr = [];


        }else if(strB.charAt(i) !== '?' && num === 0){//如果  匹配strB第一个  不是?   arrB 添加一个  strB即可
          num++;
          arrB.push(strB);
        }else{    //如果  匹配strB  不是第一位的地方   也不是  ? arrB 不需要改变    over
          //没啥事要干
        }
      }
      
      console.log('strB的所有可能:');
      console.log(arrB);
      
      //strA 遍历 strB中的每一位   有相等的就  +1 
      
      arrB.forEach(ele => { 
        for(var i = 0; i < strA.length; i++) {    //strA 遍历数组 中的每一位  ===    acc  就加一  
        var reg = '';
          if(strA.substr(i,len) === ele){
            console.log(ele+'匹配成功');
            acc ++;
          }
        }
      });
      console.log('strB的可匹配次数:'+acc);
      return acc;
    };

    fun(strA, strB);

输出结果

  感谢浏览,您大驾光临,小编的博客蓬荜生辉

原文地址:https://www.cnblogs.com/96weibin/p/8881918.html