• 一道百度前端线上笔试题


    要求:  

    输入两个字符串    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);

    输出结果

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

  • 相关阅读:
    新版《星光大道》
    acl 3.1.2版本发布,网络通信与服务器编程框架
    批量将 *.c 预处理为 *.i (递归处理文件夹中所有文件)gcc -E
    texmaker——unknown graphics extension .eps
    TexMaker
    中国计算机学会推荐国际学术会议和期刊目录
    浅谈阶梯博弈
    【hdu 3389】Game
    【hdu 3537】Daizhenyang's Coin
    【hdu 3863】No Gambling
  • 原文地址:https://www.cnblogs.com/96weibin/p/8881918.html
Copyright © 2020-2023  润新知