IT创新区招新酱油记

​ 一直觉得自己很菜,但具体程度不知道,直到…….南航IT创新区招新,本着为以后的技术面积累经验的目的,就去报名参加了。 虽然通知上说IT创新区的合作组织比如纸飞机技术部、微软技术部、科协宣企等技术部门可以不参加面试,后期考核一下合格后直接转入,但别人认可的是技术部的水平,感觉自己离那个水平有点远,所以还是老老实实去走流程。

​ 先笔试,前面有数据结构与算法、Web大前端、网络后端、逻辑思维能力这几个板块,有多项选择题,填空题。然后后面就是这几个板块的面试题,自行准备有把握或者有思路的题,做完前面会做的就可以去排队面试了。有印象的题不多,因为大部分完全不会,稍微整理一下还有点印象的题。

逻辑思维题

​ 填空题里有好几个印象挺深的题,先来看第一个吧。

火车运煤问题

​ 题目是这样的:

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问最后能运到集市上卖多少吨煤?

​ 当时脑子里一片混乱,被前端的知识点和数据结构的东西弄的有点晕,心里想着反正答案不是零,但要分段运的话。。。在草稿本上画了画图,算来算去有点不清晰,懒得算了。后来去网上搜索了一下,才发现这是有名的”火车运煤问题“,(此处更新一条消息。我正写到这里,IT创新区发来了机考的通知。。。呃,一面要求这么低的吗。。。。还以为被刷定了)看了看别人的解法,再想了会,其实也不是很难,但要在短时间内做很多这样的题目,我就感觉有点变态了。

​ 3000吨煤初步设想肯定是要运3次的,因为一次最多只能运1000吨,大概思路就是:在中间设两个暂存点1和2,第一次运到1,留下返程的煤然后回去,装满1000后到1处将煤补满至1000,到2位置,然后卸掉一些煤,留下返回到1的煤,到1后再装上回到矿区的煤,接着再把最后的1000吨煤全装上,到1时将这里剩下的煤都装上(应该是刚好凑成1000的),然后到2后再装上2处剩下的煤(同理应该恰好装满),最后运到市区。方程最后算出来的结果应该是533.3t,有兴趣的自己解下方程试试。其实这里有一个 突破点,每运1公里是要耗1吨煤的,所以一开始就能确定只需要从起点运3次,即每次都装满1000t。

这个解法直接把此问题转为了线性规划,需要一定的数学能力,不是我等数学渣渣可以轻易做到的。。。。

海盗分金

​ 这个问题是经济学上有名的模型(甚至还给它建了百度百科。。。),以前没怎么思考过,还好上次离散课上老师稍微提了一下,就说了一下逆推法,不过要注意的是这个题目说的是方案必须大于半数才能通过。找到了方法其实并不难,如果最后剩下4号和5号,5号投反对票,就可以独得金币,所以3号只需要给4号一点金币让他投赞成票就行了(其实就算3号不给4号,他也只能投赞成票,不然他就得死),然后2号就只需要给4号和5号一点点金币就可以了,同理,1号只需要给3号一点好处,然后4号或5号选一个给一点就行了,这样就能保证自己的利益最大化。重点就是后面的那个人一定会投反对票,以及,逆推

前端后端

canvas和svg的区别

​ svg,这玩意我听说的很少,查了下后才知道,svg年代久远,已经十几年了,可以自定义标签或属性,用来描述二维图形,canvas倒是看过一些大佬们写的博客,有些许了解。

​ 从功能上来讲,canvas是画布,画出来的图形为标量图形,所以,canvas可以直接引入jpg或者png类的图片,在实际开发中,canvas也很受欢迎,而且现在canvas的技术也比较成熟了。而svg则是用来描绘矢量图的,所以不支持直接引入普通的图片,但svg的矢量图不会失真,所以可以用来做一些动态的小图标,由于svg的图片不会失真,很适合用来做地图,不管怎么放大都很清晰,比如百度地图。

​ 在技术层面,canvas绘制的图片是不能被引擎抓取的,一般用javascript,而svg更多是通过标签来实现的,并且支持事件绑定。

javascript中this的用法

​ 我印象中,this就是指向当前函数的直接调用者来着,别的没了。。。呃,查了一下,简单点说就是这样:

有对象就指向调用对象

没调用对象就指向全局对象

用new构造就指向新对象

通过 apply 或 call 或 bind 来改变 this 的所指。

具体解释

http/https tcp/udp socket

​ 首先说下tcp和udp,两者都是超文本传输协议,属于传输层,但区别是,在IP环境下TCP比UDP传输数据的可靠性更强,所以tcp/ip协议对应的是数据可靠性更高的应用,tcp协议支持的应用层协议主要有:Telent、FTP、SMTP等,而UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

​ socket简单点说就是网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端就称为一个socket。而建立网络通信连接至少要一对端口号(socket),其本质就是API,对TCP/IP的封装,而TCP/IP也要提供可供程序猿做网络开发所用的借口,即socket编程接口。

​ http与https的区别就在于有无一层加密模块(SSL),http传输的数据都是明文,很不安全,于是诞生了https,一开始用的版本是SSL,但现在基本上换成了TLS。有一个问题经常会被问到:在浏览器地址栏输入https开头的URL,到整个网页界面显示完毕,发生了什么?其实问的就是https的原理。上个图

​ 1.客户端输入URL后,发起了一个https的请求,把自身支持的一系列Cipoer Suite(密钥算法套件)发给服务端

​ 2.服务端接受到客户端所有的Cipher后与自身支持的对比,如果不支持就断开连接,支持的话就从中选出一种加密算法,以证书的形式返回给客户端,证书中会包含公钥、颁证的机构、网址、失效日期等等。

​ 3、客户端收到服务器响应后会做的事:

​ 3.1 验证证书的合法性。即机构是否合法、是否过期,证书中包含的网站地址是否与正在访问的的地址一致等,证书验证通过后,在浏览器的地址栏会加上一把小锁(Chrome的亲测有效)

​ 3.2 生成随机密码。如果证书验证通过,或者用户接受不了授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。

​ 3.3 HASH握手信息。用最开始约定好的HASH方式,把握手消息取HASH值,然后用随机数加密“握手消息+握手消息HASH值(签名)”并一起发给服务端。这里之所以要取握手消息的HASH值,是为了把握手消息做一个签名,用于验证握手消息在传输过程中有没有被修改过。

​ 4、 服务端拿到客户端传来的密文,用自己的私钥来解密握手消息去除随机数密码,再用随机密码解密握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值)给客户端。

​ 5、 客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密,因为这串密钥只有客户端和服务端知道,即使在中间被拦截也无法破解。

非对称加密算法:RSA,DSA/DSS,客户端与服务端相互验证的过程是对称加密

对称加密算法:AES,RC4,3DES 验证通过后,以随机数作为密钥,就是对称加密

HASH算法: MD5,SHA1,SHA256 确认握手消息没有被篡改时

后来

​ 今天按照通知去机考,然后被PM发现是技术部的(但实际上我比技术部的平均水平差太多,所以不好意思说自己是技术部的…)最后提前走了,因为想做的板块自身基础的确不好,被告知等技术成熟了,随时接受内推。。。。(被小小地照顾了一下自尊心)