美文网首页
字符串类笔试题

字符串类笔试题

作者: ERIC_s | 来源:发表于2021-05-19 21:06 被阅读0次

    字符串类面试题

    解析 URL Params 为对象

    let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
    parseParam(url)
    /* 结果
    {
      user: 'anonymous',
      id: [123, 456], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
      city: '北京', // 中⽂需解码
      enabled: true, // 未指定值得 key 约定为 true
    }
    
    function parseParam(url) {
      const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后⾯的字符串取出来
      const paramsArr = paramsStr.split("&"); // 将字符串以 & 分割后存到数组中
      let paramsObj = {};
      // 将 params 存到对象中
      paramsArr.forEach((param) => {
        if (/=/.test(param)) {
          // 处理有 value 的参数
          let [key, val] = param.split("="); // 分割 key 和 value
          val = decodeURIComponent(val); // 解码
          val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字
          if (paramsObj.hasOwnProperty(key)) {
            // 如果对象有 key,则添加⼀个值
            paramsObj[key] = [].concat(paramsObj[key], val);
          } else {
            // 如果对象没有这个 key,创建 key 并设置值
            paramsObj[key] = val;
          }
        } else {
          // 处理没有 value 的参数
          paramsObj[param] = true;
        }
      });
      return paramsObj;
    }
    

    模板引擎实现

    let template = "我是{{name}},年龄{{age}},性别{{sex}}";
    let data = {
      name: "姓名",
      age: 18,
    };
    render(template, data); // 我是姓名,年龄18,性别undefined
    
    function render(template, data) {
      const reg = /\{\{(\w+)\}\}/; // 模板字符串正则
      if (reg.test(template)) {
        // 判断模板⾥是否有模板字符串
        const name = reg.exec(template)[1]; // 查找当前模板⾥第⼀个模板字符串的字段
        template = template.replace(reg, data[name]); // 将第⼀个模板字符串渲染
        return render(template, data); // 递归的渲染并返回渲染后的结构
      }
      return template; // 如果模板没有模板字符串直接返回
    }
    

    转化为驼峰命名

    const s1 = "get-element-by-id";
    // 转化为 getElementById
    
    function transform(s) {
      return s.replace(/-\w/g, (x) => x.slice(1).toUpperCase());
    }
    

    查找字符串中出现最多的字符和个数

    例: abbcccddddd -> 字符最多的是 d,出现了 5 次

    let str = "abcabcabcbbccccc";
    let num = 0;
    let char = "";
    
    // 使其按照⼀定的次序排列
    str = str.split("").sort().join("");
    // "aaabbbbbcccccccc"
    
    // 定义正则表达式
    let re = /(\w)\1+/g;
    str.replace(re, ($0, $1) => {
      if (num < $0.length) {
        num = $0.length;
        char = $1;
      }
    });
    console.log(`字符最多的是${char},出现了${num}次`);
    

    字符串查找

    请使⽤最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第⼀次出现的位置(找不到返回 -1)。

    a = "34";
    b = "1234567"; // 返回 2
    a = "35";
    b = "1234567"; // 返回 -1
    a = "355";
    b = "12354355"; // 返回 5
    isContain(a, b);
    
    function isContain(a, b) {
      for (let i in b) {
        if (a[0] === b[i]) {
          let tmp = true;
          for (let j in a) {
            if (a[j] !== b[~~i + ~~j]) {
              tmp = false;
            }
          }
          if (tmp) {
            return i;
          }
        }
      }
      return -1;
    }
    

    实现千位分隔符

    // 保留三位小数
    parseToMoney(1234.56); // return '1,234.56'
    parseToMoney(123456789); // return '123,456,789'
    parseToMoney(1087654.321); // return '1,087,654.321'
    
    function parseToMoney(num) {
      num = parseFloat(num.toFixed(3));
      let [integer, decimal] = String.prototype.split.call(num, ".");
      integer = integer.replace(/\d(?=(\d{3})+$)/g, "$&,");
      return integer + "." + (decimal ? decimal : "");
    }
    

    正则表达式(运用了正则的前向声明和反前向声明):

    function parseToMoney(str) {
      // 仅仅对位置进行匹配
      let re = /(?=(?!\b)(\d{3})+$)/g;
      return str.replace(re, ",");
    }
    

    判断是否是电话号码

    function isPhone(tel) {
      var reg = /^1[34578]\d{9}$/;
      return reg.test(tel);
    }
    

    验证是否是邮箱

    function isEmail(email) {
      var reg = /^([a-zA-Z0-9_\-])+@([a-zA-Z0-9_\-])+(\.[a-zA-Z0-9_\-])+$/;
      return reg.test(email);
    }
    

    验证是否是身份证

    function isCardNo(number) {
      var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
      return reg.test(number);
    }
    

    参考:

    相关文章

      网友评论

          本文标题:字符串类笔试题

          本文链接:https://www.haomeiwen.com/subject/pskmjltx.html