记一次腾讯校招前端笔试

前提

本次笔试共5题目都是算法题
前提:腾讯在线笔试,当时是在外面旅游,没带电脑,然后随便找了个网吧,腾讯要求摄像头拍摄的但是当时没有而且时间紧张不过还是买到了摄像头。
笔试环境:浏览器,IDE:浏览器,编程环境:浏览器,测试环境:腾讯笔试环境。

不过当时脑壳傻掉了,好多东西也忘了,现在重新拿出来写一下

第一题:字符串解码 (正确率50%)

小明和小红用字符串压缩通信。
字符串压缩规则是:如果有连续重复的字符串比如ABCABCABC就缩写成[3|ABC]。
现有压缩后的字符串,设计一个解压程序还原字符串。
样例:
输入: HG[3|B[2|CA]]F
输出: HGBCACABCACABCACAF

当时思路是indexOf找到最右边和最左边的 然后递归 找到最小的[...] 然后再往回递归
问题:当[3|AC][4|CC]的时候没办解析,本题GG

新思路

正则 直接取出匹配 替换 递归重复刚刚的操作

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">/**
 * <span class="zh-hans" style="box-sizing: border-box; font-family: &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, sans-serif;">字符串模版编译</span>
 * <span class="zh-hans" style="box-sizing: border-box; font-family: &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, sans-serif;">如</span> [3|ABC] to ABCABCABC
 * @param {String} str 
 */</span>
<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">templateParsing</span>(<span class="hljs-params" style="box-sizing: border-box;">str</span>) </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> rex = <span class="hljs-regexp" style="box-sizing: border-box; color: rgb(0, 153, 38);">/\[([0-9])\|([A-Z]+)\]/g</span>;

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> list = rex.exec(str);
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span> (!list || !list.length) {
templateParsing.res = str;
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span>;
}
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> [rexText, n, text] = list;
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> res_end = <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">""</span>;
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">for</span> (<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> i = <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 128, 128);">0</span>; i < n; i++) {
res_end += text;
}
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> res_str = str.replace(rexText, res_end);

templateParsing(res_str);
}
templateParsing(<span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"[3|ACCC[2|X][1|P]][3|AC[4|OO]]"</span>)
<span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">console</span>.log(templateParsing.res);
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// ACCCXXPACCCXXPACCCXXPACOOOOOOOOACOOOOOOOOACOOOOOOOO</span>

第二题 识别私有IP (正确率100%)

判断一个ip地址是不是私有的
已知私有IP范围是:
10.0.0.0 - 10.255.255.255
172.16.0.0-172.16.255.255 192.168.0.0-192.168.255.255
127.0.0.0/8 # 注意!这里是一个巨坑,0/8的意思代表0-8,是一种简写方法PS:网上说是一个块地址不过当时通过了这题,但是腾讯并没有说明其含义
样例: 输入: 0.0.0.0
输出: false

当时的思路
多个if 一个一个来傻瓜式判断

新思路

正则

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">/**

  • <span class="zh-hans" style="box-sizing: border-box; font-family: &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, sans-serif;">识别私有</span>IP
  • @param {String} str
    /</span>
    <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">isPrivate</span>(<span class="hljs-params" style="box-sizing: border-box;">str</span>) </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> rex = <span class="hljs-regexp" style="box-sizing: border-box; color: rgb(0, 153, 38);">/^(127.0.0.[1-8]|10.|172.16.|192.168.)/</span>;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> rex.test(str);
    }

    第三题 驼峰转换 (正确率 30%)

    驼峰转换
    把一个由 - 或 _ 或 @ 连接的变量词组转换成驼峰写法
    样例:
    输入: content-type
    输出: contentType

    当时的思路 利用indexOf 取@/—/开头后面是小写a-z的 情况:浏览器跑起来还可以 不过测试服务器显示超时(不知道什么情况)

    新思路

    正则 取出所有@-有所开头的然后依次替换


    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">/
    *
  • (_-@)<span class="zh-hans" style="box-sizing: border-box; font-family: &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, sans-serif;">转成驼峰</span>
  • <span class="zh-hans" style="box-sizing: border-box; font-family: &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, sans-serif;">如</span> background-color to backgroundColor
  • @param {String} str
    */</span>
    <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">toHump</span>(<span class="hljs-params" style="box-sizing: border-box;">str</span>) </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> rex = <span class="hljs-regexp" style="box-sizing: border-box; color: rgb(0, 153, 38);">/([_-@][a-z])/g</span>;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> res_str = str;
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> list = str.match(rex);
    list.forEach(<span class="hljs-function" style="box-sizing: border-box;">(<span class="hljs-params" style="box-sizing: border-box;">item</span>) =></span> {
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">const</span> code = <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>.fromCharCode(item.charCodeAt(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 128, 128);">1</span>) - <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 128, 128);">32</span>);
    res_str = res_str.replace(item, code);
    });
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> res_str;
    }

<span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">console</span>.log(toHump(<span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"bac_adas_sdf@zdsf-asdf@sdf"</span>));

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// BacAdasSdfZdsfAsdfSdf_</span>

第四题 星球开会 (看不懂)

企鹅星球上一天有N(<200000)个小时(时间不包含0点),对应N个时区,当第1时区一点的时候第2时区已经两点了,以此类推 每个时区有Ai个人,每个时区上的人只有在[u,v)时间内有空,现在想要让尽可能多的人开会,给出开会时第一时区的时刻
样例:
输入: 3 2 5 6 1 3
输出: 3

没思路,现在也不想看

第五题 没记住题目 上面题目详情也是百度了好久

个人总结

  1. JavaScript 正则的好多方法都忘了或者当时没想到的
  2. 事先没准备齐全,只有一个浏览器,真的难受,当时找不到摄像头还有点慌
  3. 第一题浪费时间太多了