扫码关注公众号

前端算法考点之智力分析
05-16
166观看
01

如何快速找出一个32位整数的二进制表达里有多少个"1"?用关于"1"的个数的线性时间?

答案1(关于数字位数线性):for(n=0;b;b>>=1)if(b&1)n++;答案2(关于"1"的个数线性):for(n=0;b;n++)b&=b-1;

来自:智力分析问题-智力分析题
02

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

来自:智力分析问题-智力分析题
03

一个容量无限的水龙头,两个容量确定的杯子,一个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升水。

来自:智力分析问题-智力分析题
04

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

解法:通过random3生成random9step2: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之间输出即可。由于题目并没有要求每次生成的时间相同,而只是概率相同,这样的方法是满足题目要求的。举一反三,randomx生成randomy的套路如下:如果x>y,那么直接多次执行randomx,剔除大于y的结果即可。如果x<y,那么借助区间,生成randomx^2,判断x^2是否<y,如果还小,那么继续生成randomx^4,直到区间大于y即可。js伪代码如下:random3;functionrandom9(){consta=random3();constb=random3();constc=(a-1)*3+b;returnc;}functionrandom7(){letres=random9();while(res>7){res=random9();}returnres;}

来自:智力分析问题-智力分析题
课程
专栏
算法-智力分析问题-智力分析题
3专栏
1课程
4 试题