R·ex / Zeng


音游狗、安全狗、攻城狮、业余设计师、段子手、苦学日语的少年。

IT 创新区招新题部分题解

注意:本文发布于 2372 天前,文章中的一些内容可能已经过时。

本文只会写我出的那些题,然而最终版笔试题把我一开始出的有点难度的题都给砍掉了,那些题也一起写进来吧。

笔试部分

Web 大前端

1. 下面哪个标签表示该元素是一个超链接?(A)
A. <a>
B. <b>
C. <i>
D. <link>

HTML 概念题。

2. 目前在 HTML 中最新的 DOCTYPE 是什么?(A)
A. <!DOCTYPE html>
B. <!DOCTYPE html5>
C. <!DOCTYPE HTML5>
D. <!DOCTYPE HTML4.1>

HTML5 是截至目前最新的标准,它的 DOCTYPE 后面只有 html

3. 如果想要让 <video> 元素带有进度条等控件,需要如何实现?(B)
A. <video control>
B. <video controls>
C. <video style="controls: true">
D. <video show-controls>

HTML 概念题。

4. 下面的说法中,哪个是正确的?(AB)
A. 原则上,可以在 <a> 标签中直接写 <li> 标签
B. 设置字号的时候需要注意 Chrome 等浏览器可能设置了最小字号
C. PNG24 位的图片在 IE 6 浏览器上出现背景,解决方案是做成 PNG16
D. 可以为 <input> 标签添加 type=large 属性以增大输入框的尺寸

A、B 都是概念题;C 没有 PNG16 这个东西,有的是 PNG8;D 中 <input>type 选项是用来控制类型的,例如数字或者单选框,要想增大尺寸,最简单的方法是用 CSS。

5. 关于 CSS 的盒模型,下面几个选项中正确的是:(D)
A. 因为 IE6 不支持 box-sizing,所以无法在 IE6 上面实现 box-sizing: border-box
B. 已知 box-sizing: border-box; width: 10em; border: 1em,则文字宽度最大为 9em
C. 在 content-box 中,offsetWidth 的计算不受已被确定的 borderpadding 的影响
D. border-box 更适合一般编码的思路,因此推荐使用 border-box 进行样式重置

IE6 的“盒模型”的计算规则与 border-box 完全一致,所以无需实现;B 选项应该是 width - border * 2 = 8em,C 选项由于 offsetWidth = width + (border + padding) * 2,所以是受影响的。

6. 假设 body 下面有一连串的嵌套 HTML 元素 a > b > c > d > e,它们的 position 分别为:relative > fixed > static > absolute > relative,那么它们用来相对定位的元素分别是:(A)
A. a > window > none > b > e
B. a > window > a > d > e
C. body > window > none > b > d
D. body > window > b > b > b

static → 无定位;relative → 自身;fixed → 窗口;absolute → 祖先中最近的非 static 元素

7. 在 CSS 中实现阴影效果,写法是:(B)
A. box-shadow: 5px;
B. box-shadow: 0 1px 5px #fff;
C. shadow: 5px #fff;
D. shadow: 5px;

CSS 概念题。

8. 下面的选择器中,权重最大的是:(C)
A. article#content p
B. article.content p
C. .article#content p
D. .article.content p

关于选择器权重,可以看 W3C 的 这篇文章

9. 下面哪个简写不属于目前发布的 ECMAScript?(D)
A. ES6
B. ES7
C. ES8
D. ES9

ES9 的全称为 ECMAScript 2018,目前还没有放出。

10. 在 JavaScript 中,parseInt(0.000000009) 的值是:(C)
A. 0.000000009
B. 0
C. 9
D. 9e-9

虽然很震惊,但是这道题是编程时绝对能遇到的问题,不是死抠语言特性,因此就拿过来考了。parseInt 会先把参数转换为字符串,然而如果小数点后面的零太多,就会转为科学记数法的形式 "9e-9",转为整数之后是 9。

11. 关于网页中的事件,下列说法正确的是:(B)
A. IE 默认的事件处理机制是“事件捕获”
B. 可以使用 event.stopPropagation 函数阻止事件冒泡
C. 在 Chrome 浏览器中,可以使用 element.fireEvent函数触发一个事件
D. 对同一元素使用 addEventListener 添加两次 click 事件,后者会覆盖前者

IE、Chrome 等浏览器默认都是“事件冒泡”,只有 Firefox 异类使用的是“事件捕获”;没有 fireEvent 函数,只有 dispatchEventaddEventListener 是添加一个监听器,多次添加的同一监听器都会被保留。

12. 下面的做法中,最推荐用来在动画中控制主循环 fun 的是:(C)
A. setTimeout(fun)
B. setTimeout(fun, 1000 / 60)
C. requestAnimationFrame(fun)
D. requestAnimationFrame(fun, 1000 / 60)

A 无意义;B 虽然理论上可以做到每秒 60 帧但浮点运算的误差会累积,从而导致偶尔的卡顿;只有 C 和 D 可以同步每次屏幕的刷新;D 多写了个无意义的参数,不如 C 好。

13. 在 ECMAScript 2017 中,可以用_____和_____关键字将 Promise 写成同步的形式。

答案是 asyncawait,概念题。

14. CSS 的媒体查询中,适用于屏幕的是_____、适用于打印机的是_____。

答案是 screenprint,概念题。

15. <link> 标签的作用有:_________、_________、_________等(任填三个即可)。

<link rel="stylesheet" href="...">:引入 CSS;
<link rel="shortcut icon" href="...">:引入 favicon;
<link rel="dns-prefetch" href="...">:DNS 预取;
还有一些针对移动端的优化,例如定义 Apple Touch 的图标。

16. 想在某表单 onsubmit 的函数中阻止该表单提交,最简单的方法是____________。

return false,概念题。

17. 请随意修改下面的代码,要求不出现任何循环(可以使用 JavaScript 的内置函数),同时保持函数的功能不变:

function fun(arr) {
    var t, o;
    for (var i = 0; i < arr.length; i++) {
        t = String.fromCharCode(a[i]);
        o += t;
    }
    return o;
}
可以使用函数式编程的思想来解决。参考答案如下。
function fun(arr) {
    return arr.map(c => String.fromCharCode(c)).join('');
}

18. 假设网页中有一个 <p class="test"> 标签,且网页没有其它任何的 CSS,请为其添加 CSS 使得它的首字母为红色(#F00),并且在最后加一个“end”字符串。

考察 CSS 伪类和伪元素的使用。参考答案如下。注意:伪元素可以使用一个冒号,也可以使用两个冒号。
.test:first-letter {
    color: #f00;
}
.test:after {
    content: 'end';
}

19. 请举出你曾使用过的 CSS/JavaScript/MVVM 等类库或框架并简要阐述它们的特点。

前端框架和类库那么多,随便挑一个说就可以过了。

20. (开放题)结合Web前端近几年的发展,你认为前端的未来可能是什么样的?

我个人的观点:前端编译器将成为标配,可以使用更多语言(如 C++)来写前端并编译成 Web Assembly。

HTTP 协议

1. 关于 HTTP 协议,下列说法正确的是:(B)
A. 截至目前,最新的协议是 HTTP/2.1
B. HTTP/0.9 协议的请求只有一行,即“GET 文件路径”
C. 使用 X-Forwarded-For 请求头可以获取任意访客的真实 IP
D. 在响应体中可以使用 Cookies: key=value 来设置 Cookie

只有 HTTP/2,没有 2.1;X-Forwarded-For 头可以伪造;设置 Cookie 应该使用 Set-Cookie 头。

2. 关于 MIME 类型,下列说法正确的是:(A)
A. 只要客户端与服务端都承认某 MIME 类型,即使它不在标准列表中也没问题
B. JSON 数据的 MIME 类型为 text/json
C. 无法通过控制 MIME 类型,将本应在浏览器中显示文字变为弹出文件下载框
D. MIME类型只包括一个类型(type)和一个子类型(subtype)

JSON 应为 application/json;若想弹出下载框,只需将 MIME 类型设置为 application/octet-stream 即可;MIME 类型还可以在子类型后面加分号跟描述,例如 text/html; charset=utf-8 或者 multipart/form-data; boundary=xxxxxxxx

3. 关于用户代理(UA),下列说法正确的是:(B)
A. 出于安全考虑,UA 无法在浏览器中被伪造
B. 即使将 IE 9 请求中的 UA 修改为 Chrome 的,IE 9 也基本不会有 Chrome 的效果
C. 某浏览器的默认 UA 同时包含 Chrome 和 AppleWebkit,那么它一定是 Chrome
D. 可以根据 UA 中的 MicroMessenger 判定请求一定来自微信浏览器

显然现在的浏览器都可以伪造 UA,但 IE 9 显然无法支持 Chrome 的新特性。

4. 在 HTTP 协议的标准中,下面哪个请求头不是用来控制缓存的?(C)
A. Cache-control
B. ETag
C. Cache-expires
D. If-Non-Match

没有 Cache-expires 这个头,其它头都是控制缓存的。

5. (开放题)请为以下需求设计一套API,其中所有内容均可以自定义。

需求:
  获取学生列表,需支持分页
  根据学号获取特定学生的信息
  添加一个学生
  修改一个学生的信息
  删除一个学生
一个可能的格式(仅供参考,格式也可以自定义):
  POST /api/student
  username=[username]&major=[major]
本题考察设计 API 的能力,如果可以写出 RestFul API 是很棒的,当然如果可以写出 YQL、GraphQL 也说明很喜欢追求新技术。

算法与数据结构

1. 请计算下列函数的时间复杂度:(D)
A. O(n^2)
B. O(nlogn)
C. O(n^(5/2))
D. O(n^(3/2))

bool fun(n) {
    for (int i = 2; i <= n; i++)
        for (int j = 2; j * j <= i; j++)
            if (i % j == 0) return false;
    return true;
}
严格按照大 O 的定义来讲的话,A、C、D 都对,然而 D 描述的上界更严,因此选 D。

2. 给定一个省的学生成绩单(学生数量大于十万),要对总分进行排序,同时保证分数相同的人在排序前后的相对位置不变(例如 a 和 b 分数相同,排序前 a 在 b 之前,那么排序后 a 依旧要在 b 之前),最合适的排序方法是:(D)
A. 冒泡排序
B. 堆排序
C. 快速排序
D. 归并排序

快速稳定的排序算法这里只有 D。

3. 关于最短路算法,下面说法正确的是:(B)
A. Dijkstra 算法可以用来处理带有负权边的图
B. SPFA 算法可以用来处理带有负环的图
C. SPFA 算法本质上是一个广度优先搜索
D. Floyed 算法先经过 O(N^2) 的预处理,然后可以 O(1) 计算任意两点间的最短路

Dijkstra 无法处理负权边;SPFA 过程中若某一点入队超过 N 次即可判定有负环;SPFA 本质是 Bellman-Ford 的队列优化,并不算广搜;Floyed 算法预处理应该是 O(N^3)。

4. 关于“子序列”系列问题,下面说法正确的是:(C)
A. belong 和 blogspots 的最长公共子序列长度为 5
B. 最长上升子序列问题可以使用 O(n) 的动态规划算法解决
C. 一个序列的上升子序列的数量等于其最长非上升子序列的长度
D. 单调队列无法用来优化具有最小和最大长度限制的最大连续子段和问题

A 应该是“blog”,长度为 4;B 目前最快的算法是 O(nlogn),C 的原型是 Dilworth 定理;D 不光可以优化,还可以优化到 O(n)。

5. 下面哪个术语不是搜索算法中用到的:(D)
A. 记忆化
B. 剪枝
C. 迭代加深
D. 入度

入度是图论的概念。

6. 下列“平衡树”中,实际上并不平衡的是:(C)
A. AVL
B. SBT
C. Splay
D. 红黑树

Splay 的原理只是将最近访问的点旋转到根,并没有规则来保持树的平衡。

7. 关于一个有 n 个元素的二叉堆,下列说法正确的是:(C)
A. 在堆中删除一个元素的时间复杂度为 O(n)
B. 若该堆为大根堆,则取得最小元素的时间复杂度为 O(1)
C. 若为堆中元素建立反向索引,则查找任意元素的时间复杂度仅与索引有关
D. 若将其改为左偏树,则它与另一棵左偏树合并的时间复杂度为 O(1)

删除二叉堆元素的方法是将其与尾部元素交换、删除、上浮或下沉,时间复杂度为 O(logn);大根堆只能瞬间取得最大元素;左偏树合并的时间复杂度为 O(logn)。

8. 下列说法正确的是:(C)
A. “P 与 NP”问题已被证明,P≠NP
B. 存在一个算法,在给定了源代码和输入的情况下,判断程序是否可以停止
C. 可以使用一个多项式时间复杂度的算法,将旅行商问题归约为 3-SAT 问题
D. 可以使用一个多项式时间复杂度的算法,验证旅行商问题的答案的正确性

A 是上古难题至今无解;B 停机问题不可解;C 属于 NP 问题之间的归约;D 无法在多项式时间内验证 NP-Complete 问题的解。

9. 关于确定性有限状态自动机(DFA),下列说法正确的是:(B)
A. 正则表达式可以直接转化为DFA
B. 两个相同的DFA,提供相同的当前状态和相同的输入,一定有相同的输出
C. 对于一些特殊的DFA,无法找到与其计算能力等价的最小DFA
D. 一个DFA可能有若干个不同的初始状态

正则表达式需要先转化为 NFA 再将其确定化;B 是 DFA 的特性之一;每个 DFA 都有一个最小 DFA;DFA 的初始状态 q0 唯一。

10. 下面哪一种不属于二叉树的遍历方法?(C)
A. 前序遍历
B. 中序遍历
C. 倒序遍历
D. 后序遍历

真的有人听说过 C 这么奇怪的名字么?

11. 在使用 KMP 算法匹配字符串时,假设子串为“ababaca”,在 c 处失配,则需要回溯的 π 值(π[5])为_____。

π[i] 的定义就是“最长的同时为母串的前缀和母串长度为 i 的前缀的后缀……的字符串的长度”,在这里是 "aba",所以应该是 3。

12. 3^1000 Mod 100的值为_____。

答案是 1,如果不怕麻烦的话可以找末位数字的规律,如果怕麻烦的话可以使用快速幂。

13. 算法中时间与空间的矛盾一直存在,哈希表使用的是以_____换_____的策略。

哈希表是以空间换时间,这是概念题。

14. 约瑟夫问题:5 个人围成一圈,顺时针编号为 1~5,从 1 开始顺时针循环报数,报到 4 的人自动出圈,下一个人重新从 1 开始报,那么出圈的顺序为_______________。

简单的模拟,答案是 4-3-5-2-1

15. 有一个无向图,任意两点间有且仅有一条路径,如果想让任意两点间有至少两条不同的路径,那么至少需要添加_________________________条无向边(“两条路径不同”指两条路径经过的无向边的集合不完全相等。答案可以使用文字描述,不一定是公式)。

首先发现这是一棵树,那么只需要求出树的最少链覆盖数,然后把每条链首尾相连即可,因此答案是“(c+1)/2”或者“c/2 的上取整”,其中 c 是叶子的数量。

Linux 服务器与运维

1. 下面哪个 Linux 命令可以列出当前目录下的全部文件(包括隐藏文件)?(B)
A. ls -n
B. ls -a
C. ls -d
D. ls -q

概念题。

2. 一般来说,通过软件源安装的 MySQL,配置文件的默认位置可能是:(C)
A. /var/my.cnf
B. /usr/my.cnf
C. /etc/my.cnf
D. /bin/my.cnf

概念题。

3. 在 Nginx 的配置文件中,用来表示当前请求的 Cookie 的变量是:(A)
A. $http_cookies
B. $http_cookie
C. $cookies
D. $cookie

概念题。

4. 在 Linux 系统中,/usr 文件夹的作用是存放:(C)
A. 设备对应的文件
B. 系统的配置文件
C. 用到的应用程序和文件
D. 用户生成的文件

概念题,A 是 /dev,B 是 /etc,D 是 /home

5. 在编写运维脚本时,如果需要使得脚本文件 test.shchmod +x 之后可以直接使用 ./test.sh 来运行,且启动的是 bash,则文件开头应该怎么写?(B)
A. #>/bin/bash
B. #!/bin/bash
C. $>/bin/bash
D. $!/bin/bash

概念题。

6. 如果你在 Logstash 未启动时不小心将 .sincedb 文件删除,后果可能是:(B)
A. Logstash 启动后将提示找不到日志文件,并询问下一步操作
B. Logstash 启动后将从头开始读取指定的日志文件
C. Logstash 启动后将正常运行,并重新生成正确的 .sincedb 文件
D. Logstash 启动后立即崩溃,需要重新对其进行配置

概念题。

7. 下面哪个软件不具有监控服务器操作系统的功能?(D)
A. Zabbix
B. Nagios
C. Linux Dash
D. Logrotate

Logrotate 只能切分日志,没有监控功能。

8. 在 ssh 过程中,为了保证一个可执行文件持久运行,下面的方法最不推荐的是:(A)
A. 在 screen 或 tmux 中运行该文件,然后按下 F6 断开 ssh 的连接
B. 使用 supervisor 或 pm2 作为其守护进程
C. 编写 systemd 的服务文件,使用systemctl控制其运行
D. 使用 nohup 运行该文件,并将日志输出到指定的地方

只有 A 既没有起到监控效果,又不能有效保持长期运行(例如不小心按了 Ctrl+C)。

9. 简述一下 Docker 中的 Host、Bridge、Mapped Container、None 四种网络模式的异同。

可以参考 这里。其实只要能答上来“默认是 Bridge”就已经很满意了。

10. 你和你的电脑正处于公司内网。假设由于业务需求,你需要将电脑中运行的某 Web 服务(占用端口:80)让远在千里之外出差的同事访问。在不更换所处网络环境、不将该服务的代码部署在外网服务器的情况下,可能有哪些解决办法?

可以使用企业 VPN 翻回内网,也可以使用 SSH 或 ngrok 等方式做内网穿透。

机试部分

其实机试部分并不难,主要还是考察编程基础。

简单编程题

1. 给定一个只有小写字母组成的字符串,找出其中最长的连续相同的子串。“连续相同”的定义是“至少两个相同的字符”。

基础思路:设变量 currentChar 为当前连续相同的字符,length 为长度,遇到不同的字符则 length 置零,随时将最新答案更新到全局 ans 中即可。

这道题的前提是考生使用的是 Java 或者 JavaScript 语言,因此可以使用正则表达式:/(.)\1+/g 来匹配,如果使用 JavaScript 则很方便。

return Math.max.apply(0, str.match(/(.)\1+/g).map(s => s.length))

2. 输入若干字符串作为字典,再输入若干字符串,分别查找这些字符串是否在字典中出现过。

基础思路:读入后查找。

这道题的前提是考生使用的是 C++ 或 Java 语言,因此可以使用 C++ 的 map 或者 Java 的 HashMap 等库来实现快速查找。当然,如果有人现场手撸出了红黑树或者 Trie 树这种东西就真很厉害了。

3. 最长连续上升子串的长度

设变量 startend,碰到下降的位置则更新 startend 和全局的 ans 即可。

简单信安题

1. 简单的 PE 逆向

使用 IDA 打开后 F5 即可看到具体思路:将读入字符 ASCII 码全部加一后输出。

2. alert(1) to win 的第一关

考察点:基础 XSS 注入,由于可以上网查找资料所以变得很简单。

总的来说,考生的能力没有想象中的那么强,因此笔试的时候即使难题基本被删光了,也很少有人能在某一特定的方向做出一半以上的题,所以机试不得不出的水了一些。学弟学妹们还是要加油啊,记得我们这一级大一大二的时候还是有一些人能达到这个目标的。

Disqus 加载中……如未能加载,请将 disqus.com 和 disquscdn.com 加入白名单。

这是我们共同度过的

第 3050 天