[面经]JAVA/大数据开发方向面试过程中碰到的一些题目
面试***
等offer等的难受,本人投递的是java和大数据开放方向的岗位。在此记录一下面试过程中碰到的回答的不好的题目(附上答案和思考)。
问题1
带有* ( )的括号匹配问题,其中*可以表示”(”或”)”或”空白”,问给一个由“*()”组成的字符串,是否可以括号匹配。
思路
经典的括号匹配需要一个栈就可以匹配,这种带*的括号匹配可以考虑用两个栈来解决,一个栈存括号,另一个栈存*。
问题2
面试过程中讲到了CAS中的ABA问题,面试官问出现ABA的场景和例子是什么?
思路
ABA问题的定义网上都有,面试也准备过。但是ABA的场景一时间没想起来,上网查阅找到一个合适的例子:
小明在提款机,提取了50元,因为提款机问题,有两个线程,同时把余额从100变为50
线程1(提款机):获取当前值100,期望更新为50,
线程2(提款机):获取当前值100,期望更新为50,
线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50
线程3(默认):获取当前值50,期望更新为100,
这时候线程3成功执行,余额变为100,
线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!
此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50)这就是ABA问题带来的成功提交。
问题3:
有两个数据集A和B,每个数据集都按递增顺序排列,使用迭代器分别求两个数据集的交,差。(考的是数据库的left join和join的算法简单实现)
思路:
迭代器有hasNext()和Next()方法,这个题倒不是很复杂。
问题4
写一个算法,判断a+b>c,其中a,b,c都是带符号的long类型。
思路:
这个问题,思考一下题目很快判断出来这题考的是判断溢出。
思路是,考虑哪些场景会溢出,a,b同时大于或者同时小于0才会溢出,同时a,b,c同符号的时候才用判断是否会溢出。
我们拿溢出阈值(Long.MAX_VALUE)减去a然后和b比较,如果b大,那么a+b会溢出,两个负数同理。
问题5
一个java的业务代码,底层是MySQL数据库,某一天突然发现执行变得很慢,请问如何排查。
思路
参见:腾讯面试题:一条SQL语句执行得很慢的原因有哪些?
https://www.cnblogs.com/technologykai/articles/10794557.html
同时还要考虑java业务层的代码问题,首先要定位哪里出了问题。
问题6
100亿个手机号的数据集,问有多少个不重复的手机号。
思路
考点:手机号加载到内存用什么数据结构,如果用int数组存的话,会占用太多空间,String和long听起来都是很不错的选择。
还可以计算下100亿手机号在内存中的大小。我觉得可以用bitmap存这些手机号,但面试官不太满意,最后说用hash划分的方式并行计算。
问题7
写一个LRU***
思路
这个题很好写...在leetcode上也练习过,但是,我忘了多线程同步了...没有加sychnorized,被面试官指出来,自己也意识到这是个很严重的错误。
在leetcode上的题目也没有加锁,可以通过,但是实际场景中LRU***必然是多线程访问的。
问题8
面试官让我讲讲自己的3个优点和3个缺点
思路
完全没准备过,现场想的... 大家可以提前准备一下。
感受,自己还是太菜了,而且转java,Spring一套还没学,面试的时候磕磕绊绊。
#面经##Java工程师##校招##腾讯#