一道百度前端線上筆試題

要求:  數組

輸入兩個字符串    strA   長度 1-50  只能包含 0或者1spa

           strB   長度 1-5    能夠包含 0或1或?   (? 表明    0  或者 1)  code

例如blog

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);

輸出結果博客

 

  感謝瀏覽,您大駕光臨,小編的博客蓬蓽生輝io

相關文章
相關標籤/搜索