@adamhand
2019-03-08T10:46:35.000000Z
字数 3009
阅读 4816
给定联合索引(a,b,c)
,下面的语句那些可以用索引,那些不可以:
where a=1 and b=2 and c=3;
# 这条语句中a b c
都可以用到联合索引where a=1 and b>2 and c=3;
# 这条语句中,a b
能用到,c
用不到where a=1 and b=2 and c>3;
# a b c
都可以用到where b=1;
# 这条语句用不到索引where a=1 and b=2 order by c;
# a b
能用到,c
用不到zset底层用了跳跃表。跳跃表是一种多层链表,相当于对一个链表不断向上抽取索引,查询的时候从上往下查找,类似于使用索引,复杂度为log(n),n为最底层链表的节点数。红黑树的查找效率也为log(n),但是红黑树的构造比跳跃表复杂,插入元素的时候需要进行旋转等操作。
跳跃表可以参考这里
这个是唯一问到的关于java的问题,可以参考这里
我说C语言不是很清楚,讲了一下java的内存划分,java内存划分可以参考《深入理解Java虚拟机》那本书,第一章就讲到了。
他问这个问题的主要意图是让我答explain这个关键字,当我说我会先用explain语句分析一下查询的过程时,他就说可以了,不用再说了。
这个我当时没看。可以参考这里
给定无序数组:m[1,6,5,3,5,6,5],n[3,6,5,6,5,6]和一个整数target,求一组数m[i]+n[j]=target,只要满足条件就返回。
他听了一下思路说第三种可以,最后也没让写代码。
大规模排序问题。给定一个大文件,里面存储着很多IP地址,这个大文件内存放不下。找出这个文件中出现次数最多的10个IP。
内存中放不下的意思是不能直接将这个大文件加载进内存进行排序。这种情况一般选择使用“分治”的思想。
具体做法如下:
先自我介绍,问了一些个人的问题,相当于聊天。
我选了一个后台管理系统说,这是我新加到简历上的,说了一个大概的过程。
这个是一个商品的后台管理系统,使用bootstrap+thymeleaf了一个简单的前端,使用Spring boot做后台框架,mybatis做持久层框架,redis做缓存,rabbitmq做流量削峰。大概的操作过程这样的,用户从前端选择商品,点击购买之后,请求首先会被放入redis中,使用redis做缓存的主要目的是加快前端页面的反应速度,如果不加redis而直接进入数据库的话, 响应速度会比较慢,而且当请求比较多的时候会对数据库造成比较大的负担。redis中存储了该商品的编号和剩余的数量,判断剩余数量是否足够,足够的话就将数量减一,然后将更改的数量放入rabbitmq中,使用rabbitmq的主要原因是防止一瞬间大规模流量会压垮数据库,起到一个削峰的效果。然后mysql数据库作为消费者从rabbitmq中取出更新后的商品数量,插入内存中。
我觉的说这种项目的时候,把数据从前端到后端的传递过程说清楚了,就差不多把整个项目讲清楚了。
这个问题一面面试官也问到了。
这个没答上来
在数据库查询操作变得很慢的时候,考虑加上索引。
这个不也不会,我给他讲了一下Java中的fork/join。fork就是“分”,join就是“合”,所以fork/join的也是分治的思想。当一个任务非常大的时候,往往会将它分为很多小任务,将每个小任务分给一个线程尽心处理,处理完之后再将结果汇总。所以fork/join可以说是分治的多线程版本。
一般遇到这样的问题就得小心。我当时答的他不太满意,听完之后就很严肃了。这种问题的一般答法应该是这样的:首先,不排斥加班,加班是正常的现象。因为一个人的能力总是有限的,所以在项目中说不定什么时候就会遇到一个比较难解决的问题,而在这时候,如果计划的进度被耽误了,那么自己加加班把进度赶一下是理所应当的事,保证最后的交付不会出问题。
他当时描述的情况是:假如某个周的周一,小组定了这周五要交付任务,但是到了周五当天,忽然有人说遇到了问题耽误了进度,必须延一周,问我怎么看这种情况。
这种问题的答法一般是:首先尽量保证自己不会出这样的问题。但是作为一个实习生来说,能力是有限的,可能有时候会遇到自己解决不了的问题,当自己确实无法解决的时候,就要求助同事,或者提早进行反馈,比如周二遇到了问题,经过自己的一番努力没有解决的话,就要及时反馈,不能等到周五的时候,马上要交付的会后再说。
分金条的问题,是网上的一个题。大概描述如下:
一位地主雇佣一位工人,雇佣期为7天,报酬是一根金条。现在的情况是,工人每天都要拿七分之一根金条,而只允许地主在金条上切两刀,问怎么切能够满足情况。
一开始我以为要两刀切成等大的七块,所以就陷入了一个误区。后来明白了不一定要切成七块,只要保证工人第一天结束后手里有1/7根金条,第二天结束后手里有2/7根金条,第三天结束后手里有3/7跟金条......就行。所以应该将金条切成1,2,4。第一天给工人1,第二天给工人2,并将1要回来,第三天再将1给工人......。
腾讯貌似挺喜欢问这种智商题的,还看到一个,可以看一下这里。