面试碰到智力题,低情商,太卷了,高情商,综合实力考察!

最近互联网裁员风头正盛,虽然真实的感觉是身边失业的朋友并不多,甚至有些同学的年终还超出预期,而且有些公司的坑位还逆势上涨。

说实话,时常感觉自己跟不上对这些现象的理解,故只能分享几道新鲜出炉的前端智力题,让大脑从业务代码的繁杂中抽离出来活动活动。

题一:数格子

题目描述:8x8的正方形棋盘,一共有多少个正方形格子。比如1x1的棋盘,只有一个正方形,而2x2的棋盘,则有4个边长为1的小格子+1个边长为2的大正方形,一共五个。

题目分析,这个题应该会感觉熟悉,记不清是小学还是初中,经常让人数来着。这个题目,多画几个,找出规律就可以解决了。

对于3x3的格子,有9个边长为1小格子,4个边长为2组成的格子,再加上最外层边长为3的大格子,也就是3x3 + 2x2 + 1 = 14

而对于4*4的格子,有16个边长为1的小格子,然后是9个边长为2的格子,再加4个边长为3的格子,再加上一个边长为4的大格子,也就是 4x4 + 3x3 + 2x2 + 1 = 30。

依次类推,8x8的棋盘,则为 8x8 + 7x7 + … + 2x2 + 1。

说实话,这题很简单,小学的时候做起来可能有点吃力,但是现在回头看,有点耐心,这点规律还是容易看出来的。

题二:倒水

题目描述:一个容量无限的水龙头,两个容量确定的杯子,一个4升,一个9升,如何倒出6升水。

这题其实也是个智力题,但是因为步骤较多,在脑子中堆栈的深度较深,紧张的时候容易答不上来。

答案如下:

将9升杯子倒满,倒入4升的杯子中,此时9升杯子中剩余5升,将4升杯子倒掉,再将9升杯子剩余的水倒入4升杯子,此时9升杯子中剩余1升水,将4升杯子倒掉,9升杯子中剩余1升倒入4升杯子中,此时9升杯子水为0,4升杯子中还有1升水。此时将9升杯子倒满,倒入4升杯子中,由于4升杯子原本有1升水,那么9升会被倒掉3升,便得到了题目要的6升水。

说实话,此题并不复杂,但是全凭脑子想的话,堆栈较深,不见得简单。似乎好像确实能判断下智商。

题三:随机数生成

题目描述:有一个可以等概率生成随机数1-3的函数,random3,要求写出一个可以生成random7的函数,可以等概率的生成数字1-7。

这个题目,应该是面试题中还算频率较高的题目,自古多情留不住,唯有套路得人心。这种题目,如果是第一次接触,必然要耗费不少时间,但是此类型题目一旦理解过,就再也不是问题了。

解法如下:

step1: 通过random3生成random9
step2: random9中剔除大于7,即可生成random7。

其中,第一步可能相对有点绕,如何通过random3生成random9,可以分两步:

第一步:执行一次random3,得到的结果称为a
第二步:再执行一次random3,得到的结果称为b
第三步:将第一步得到的a想像成1-9中的[1-3], [4-6], [7-9]区间,如果a为1,那么表示结果落在第一个区间,具体是1-3中的哪个数字,由数字b决定,用公示表示,即结果c = (a - 1) * 3 + b

而从random9生成random7,只需要不断循环,如果结果小于等于7,那么输出,否则再次循环,直到结果落在1-7之间输出即可。由于题目并没有要求每次生成的时间相同,而只是概率相同,这样的方法是满足题目要求的。

举一反三,random x生成random y的套路如下:

如果x > y,那么直接多次执行random x,剔除大于y的结果即可。
如果x < y,那么借助区间,生成 random x^2,判断x ^2是否 < y,如果还小,那么继续生成 random x^4,直到区间大于y即可。

js伪代码如下:

random3;

function random9() {
    const a = random3();
    const b = random3();
    const c = (a - 1) * 3 + b;
    return c;
}

function random7() {
    let res = random9();
    while (res > 7) {
        res = random9();
    }
    return res;
}

题四:大富翁

题目描述:有一个大富翁游戏,骰子共6个数,每次掷骰子等概率产生1-6,可以往前走对应数字个格子,问,不经过100个各自的概率。

这个题目,相对有点绕,也有点动态规划的意思。简单分析
到达第一个格子的概率是 1/6

到达第二个格子的概率是 1/6 + 到达第一个格子并且掷出1的概率

到达第三个格子的概率 1/6 + 到达第1个格子且掷出2的概率 + 到达第2个格子且掷出1的概率

以此类推:
到达第七个格子的概率,便是用户到达第一个格子并掷出6的概率 + 到达第二个格子并掷出5的概率 + 到达第三个格子掷出4的概率 + 到达第四个格子掷出3的概率 + 到达第五个各自掷出2的概率 + 到达第六个格子掷出1的概率

到达第n个格子的概率,就是达到n-1的概率并掷出1的概率 + 达到n-2的概率并掷出2的概率 + 达到n-3的概率并掷出3的概率 + 达到n-4的概率并掷出4的概率 +
达到n-5的概率并掷出5的概率 +
达到n-6的概率并掷出6的概率

以n表示格子数,可以得到如下公式:

如果n > 6:

f(n) = 1/6 * f(n-1) + 1/6 * f(n-2) + 1/6 * f(n-3) + 1/6 * f(n-4) + 1/6 * f(n-5) + 1/6 * f(n-6);

而如果n <= 6 ,那么需要特殊处理,因为 n-x 可能会小于0,如果n-x小于0,那么概率便加0。同时由于可以直接到达,那么必定有1/6的概率保底。公示如下:

f(n) = 1/6 +
1/6 * (n - 1 > 0 ? f(n-1) : 0) +
1/6 * (n - 2 > 0 ? f(n-2) : 0) +
1/6 * (n - 3 > 0 ? f(n-3) : 0) +
1/6 * (n - 4 > 0 ? f(n-4) : 0) +
1/6 * (n - 5 > 0 ? f(n-5) : 0)。

根据公式,这就是一道入门的动态规划题,写出代码不难。其实和经典动态规划题目爬楼梯如出一辙。难倒是不难,但是没有接触过动态规划思想的同学,估计难受了。

最后

说实话,前端的面试中,其实本身就有很多和业务相关的可以问的坑在里面,像原型,闭包作用域,react hooks中,与实际业务贴合的坑本身就很多,还要问智力题的话,其实多少有点说不过去。

碰到智力题就当来了个脑力运动吧,大脑做做运动也是极好的。