TB 解题思路

Yizhe Wang
11 min readNov 16, 2020
  1. 关于Prefix Tree和平衡二叉树

答案选第一个,前缀数/字典树,类似于这么个东西,具体分析请参考Lily的github

前缀树也有个名字叫Trie,涉及字典查询的最快ADT应该就是trie了。

2. HTTP response code

我们可以看到 A 和 B 不符合要求 因为问题不是因为authorized 或者 得到 partial 响应, 所以我们答案要在 C D, E就不考虑了 我强行要懂 因为我们要redirect to new source through new resource, 所以答案是D

Gao, R. (2020) Link

3. Frame上的计算量过大引发图片render不consistent的问题。

经过大家的讨论和lily队友的分析,应该选第一个。

具体参看Rex 的github

4. 数据库规模化问题

我个人认为这个题选第一个或者第四个,题目问的是在write load增大的情况下,如何优化,第一个说删除没用的index,index使读变快,但是使写变慢,因为频繁添加数据,就要频繁的给原来的index tree加东西,很耗时,删掉index反倒会增加效率。(同时解释了第三个为什么不对),而第四个说设置主从机制(m/s),主从机制可以容灾、解决所谓“死锁/锁”的问题、并且添加负载均衡。其中处理负载均衡和死锁都能大大提高数据库的效率,读写双向加速,所以理论上这两个都可以,但是我个人认为更make sense的是A。

5. 服务器不接受外部request,有可能是bind在那个本地地址?

127.0.0.1也被称为是localhost,所以我觉得这个选C的面比较大。参看这个stackoverflow

6. 搜索引擎,热搜问题:

我猜测是选1, 听上去和mapReduce有关,以为题目中提到了thousands of computers, mapReduce就是在处理服务器集群时很有优势。这篇文章的文末就讲了这个热搜问题。

relational database其实处理这种类型的数据是很慢的select,order,limit全局操作几亿条,不可行。

redis是可以做的,而且很快(用的是内存),参看链接,但是题目中提到了服务器集群,所以我觉得选第一个的概率更大。

倒排是很有用的搜索用的technic,但是和热搜好像不是特别相关,参看链接

第二弹:

按照M神的指导,这个题应该是选B,而且选项也可以写的更加清晰一些:

To be more precise, if the returned index is less than Math.floor(Math.sqrt(arr.length)), exponential would be faster than binary search.

具体思路参看M神的github链接

简书上的一个带代码的解答

应该选A:

Lily给出的讲解如下:

a) stack’s allocation is faster than heap because stack allocates in a contiguous block yet heap is allocated in any random order. In a contiguous block, we can use base + offset(基址 + 偏移量) for O(1) access. 所以应该选A。

heap上的malloc其实很复杂,要看后面是不是跟了足够的位置可以放置这个变量,假设我们定义一个1000000个el的array,内存首先给这个array布置一个pointer在stack上,然后去给这个array找能够连续放1000000个el的heap位置,有时候能找到,有时候找不到,不信你们可以用node试一试,我的电脑能处理大概1亿长度的array,多了就不行了。

b)heap上容易出现fragment,stack是指针按行来的,不会出现什么fragment。

c)no, both of them stored in RAM.

d)memory leaks are actually more likely on the heap,heap上的叫memory leak,使用low level语言(c)操作malloc的时候不及时的free(), 就会导致heap被用光,无法再给别的变量malloc。stack上发生了类似的情况应该就叫stack overflow了,recursion时我们经常会看到。

应该选D:

rest的api可以分version,调整好namespace,然后在router上做好api/v1, api/v2就可以了,这样可以防止做大规模修改的时候出现兼容问题。这篇知乎讲的不错:链接

根本不知道什么是GraphQL:只能google了,参考看一篇全懂系列

应该选A。

chmod 命令很有用,这个我们要了解一下rwx: read4, write2, execute1,三个权限,打开terminal,随便挑一个folder,建几个文件,ls -la一下就能看到他们的权限,具体一点的这个视频全解释。go-r+w就是在给group这个组减掉read权限,增加write权限,这不合理,出现了unprotected了就是说明写的权限给的太大了,这个rsa的key有的时候是负责ssh的,链接远程服务器或者电脑的密钥,这个密钥如果谁都能写的话,就会导致很严重的安全隐患,所以这个除了user之外,别人应该什么权限都没有,所以时user:6 group:0 other:0,所以应该选A,不选B是因为它对应的应该是public key,题目中要求的是private key。但是理论上来说,遇到key有这种安全隐患了,两个都应该chmod 600,甚至更严格的chmod 400.

应该选A:

Rex大神的解释如下:

A language is statically-typed if the type of a variable is known at compile-time instead of at run-time.Common examples of statically-typed languages include Java, C, C++, FORTRAN, Pascal and Scala JSON is a format that encodes objects in a string. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert string -> object).Dynamic program doenst care about time.if we deserializing JSON in a statically typed language, we have to worry about types as we deserialize things.So the answer is A;

强类型语言在compile time如果发现code中有不和规矩的地方就会报错,而弱类型语言在compile时候一般会let it go,这个也就使得强类型bug少而且跑起来比较快,但是写起来麻烦,弱类型写起来快,但是解析的时候就比较耗时,而且会有意想不到的问题,比如说javascript中的 ‘10’ < ‘2’ =》 true的问题,这种问题在c语言中不会出现,因为在compile时直接报错, “<” 只可以处理int类型,出现别的类型,不会过。js可以过,但是过了之后结果就比较搞笑。强类型语言处理弱类型语言的JSON就的确很痛苦,对方的object过来了,他得根据里面的数据类型给每个数据表明type:进来的是 a =8 , c = ‘d’ 要翻译成类似:int a = 8; char c = ‘d’…

第三弹

20和23就是对于container/docker和Kubernetes的区别和关系,了解docker从文档开始:document

docker是类似于虚拟机的一种存在,只是每个docker container都占用非常少的系统资源,省去了传统虚拟机所需要的“hypervisor”层,而且易于扩展,docker之间可以互相连接,比如一个docker来跑node,一个来跑postgresql,互不干扰,可以通过特定的config连接到一起。

20题的答案应该是选D,因为输入了指定命令后会有如上图的log。docker 的特点是每次的container都是一个新的container,不能存信息在container中,但是可以通过container和主系统的连接分享文件夹并进行操作,这样一来信息就可以保存了。

23题应该是选A,Kubernetes,直接去kubernetes的官方文档就可以看到解释,它是一个container集群的协调器

salt是做automation的,具体没研究

ApacheZooKeeper,原来是hadoop的子项目,后来从hadoop中分离出来,hadoop是做大数据的,和第二弹中的mapreduce有关,我个人的理解是处理大数据的类似postgresql的东西,但是CRUD的方式完全不是用的sql,参考知乎简介(non technical)。ApacheZooKeeper一开始是为了Hadoop管理config和协调服务器集群的,后来独立出去,应该是可以为很多其他的分布式系统管理文档了吧,太具体的不清楚了。参看链接

这个题应该是选D, root强大到删除bin folder,毁坏操作系统的必要程序,所以如果一个server给了root权限,其实是很有风险的,黑客可以通过业务代码的漏洞改变服务器的bin,装第三方库。。。其实做网站,我们只需要在我们需要的folder里面放入业务代码,而不应该有权限去操作业务代码之外的文件夹,所以用chroot监狱把权限控制住应该可以避免不必要的麻烦。

A不合理,就是要控制权限,B,port forwarding和ssh远程链接有关系,和这个不相关,C我根本不懂,看了几篇文章,云里雾里的。

区块链。。。

应该选C,并不是由第三方来sign,它是chain of signatures,从上面接受下来,然后签一个hash,再传下去,一道道签名就是它的安全保障。知乎文章可参考

ABD都是对的啦。

这种操作也叫做upsert,if-exists-update-else-insert

所以应该选C

这是一个涉及到搜索引擎的工作原理的题。

我相关的知识是在是太浅薄了,B我觉得是不可行的,网页实在太多了,所有IP也太多,不太可行,整个的过程应该是一个recursive的过程,而不是iterative。D虽然是recursive,但是会有很多的重复,应该是不够优化。

A能避免重复的爬网页

C能利用mapReduce 来scale

我觉得都可以。。。

--

--