luxin 2019-09-20
本人双非普本毕业,在职场上也摸爬滚打了4年的时间了,可以算得上是一个有4年经验的老码农了,之前一直都是在某小厂工作,今年准备跳槽,个人的目标是BAT,但主要还是想去阿里或腾讯,自己之前的项目经验感觉还不错,所以比较有信心,但万万没想到自己腾讯和阿里的面试全凉了,一个offer都没拿到,后来回来思前想后,可能还是自己的准备不充分,但也确实是这些大厂太难进,这些面试题实在是不好答(附上我的思路),所以分享给大家,看有多少人知道?
问题一:带有* ( )的括号匹配问题,其中可以表示”(”或”)”或”空白”,问给一个由“()”组成的字符串,是否可以括号匹配。
思路:
经典的括号匹配需要一个栈就可以匹配,这种带的括号匹配可以考虑用两个栈来解决,一个栈存括号,另一个栈存。
问题二:面试过程中讲到了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问题带来的成功提交。
问题三:有两个数据集A和B,每个数据集都按递增顺序排列,使用迭代器分别求两个数据集的交,差。(考的是数据库的left join和join的算法简单实现)
思路:
迭代器有hasNext()和Next()方法,这个题倒不是很复杂。
问题四:写一个算法,判断a+b>c,其中a,b,c都是带符号的long类型。
思路:
这个问题,思考一下题目很快判断出来这题考的是判断溢出。
思路是,考虑哪些场景会溢出,a,b同时大于或者同时小于0才会溢出,同时a,b,c同符号的时候才用判断是否会溢出。
我们拿溢出阈值(Long.MAX_VALUE)减去a然后和b比较,如果b大,那么a+b会溢出,两个负数同理。
问题五:一个java的业务代码,底层是MySQL数据库,某一天突然发现执行变得很慢,请问如何排查。
思路:
一条SQL语句执行得很慢的原因有哪些?
同时还要考虑java业务层的代码问题,首先要定位哪里出了问题。
问题六:100亿个手机号的数据集,问有多少个不重复的手机号。
思路:
考点:手机号加载到内存用什么数据结构,如果用int数组存的话,会占用太多空间,String和long听起来都是很不错的选择。
还可以计算下100亿手机号在内存中的大小。我觉得可以用bitmap存这些手机号,但面试官不太满意,最后说用hash划分的方式并行计算。
问题七:写一个LRUcache
思路:
这个题很好写…在leetcode上也练习过,但是,我忘了多线程同步了…没有加sychnorized,被面试官指出来,自己也意识到这是个很严重的错误。
在leetcode上的题目也没有加锁,可以通过,但是实际场景中LRUcache必然是多线程访问的。
总结
面试一定要要自信,但不能盲目自信,自信是建立在有充足准备的前提下的,所以有跳槽打算的,或正在面试的,一定要复习一些知识,准备好一些题目的答案,不要以自己的项目经验为傲,很多大厂也很看重面试者对基础知识点的掌握程度的。
————————————————
版权声明:本文为博主「Java阿谷」的原创文章
原文链接:https://blog.csdn.net/weixin_45600362/article/details/100925459