3.6上周题目总结

        今天将对上周发布的几道面试题进行总结:

第一题:一段n级的阶梯,可以一步有两级,也可以一步走一级,走完这段楼梯可以有多少种走法?

这是一道最后的答案是只要实现f(n)=f(n-1)+f(n-2)就可以了,思想上可以这样理解:假如只有3阶那么走法我们用穷举法发现可以有,111,12,21三种。那么4阶呢,4阶比3阶多了1阶,用穷举法是,1111,121,211,22,112。其实可以理解为新加的那阶阶梯是1,那么就是3阶走完再走1步,所以是f(n-1)。然后最后1阶如果是两步走的,那就是f(n-2).既答案是斐波那契数列f(n)=f(n-1)+f(n-2)。在这里需要指出的是,要注意临界值,所以最终的答案是,f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)  (n>1)。核心代码:

fib(n){

    if(n==1||n==2){

        return 1;}

    if(n==0){

        return 0;}

    return fbn(n-1)+fbn(n-2);

}

小虫大神的详细讲解

第二题:某品牌有10000桶牛奶,但因为工作人员不小心其中一桶混进去了毒素,现准备若干只小白鼠进行试验,已知毒素发作死亡需要一天时间,问最少需要多少只小白鼠并在一天内查出哪桶牛奶出现问题?

这一题大神joel已经给了特别详细的解答,我直接放链接了~用10只老鼠找出1千瓶水中的1瓶毒药(附 JS 实现),主要思想就是用二进制表示总数。

第三题:9999个数字中只有一个数字是唯一的,其他的数字都是成双的,请找出这个数字?

这一题用到了异或算法,真^真=0,假^假=0,真^假=1,假^真=1。既相同的异或都会变成0那么9998个重复的数只要全部异或就会成为0。

for(n=0;n<9999;n++;){

    m=m^a[n];

}

第四题:9999个数字中只有两个数字是唯一的,其他的数字都是成双的,请找出这个数字?

2进制数按位异或的时候,如101^100=001,即你会发现不同的位数会变为1,也就是如果你全部异或一次会得到一个代表当位两个数不同的数字,这时候你只要找到这一位:

while(m%2!=0){

    m=m%2;

    f++;//f指位数,如十位f=1;

然后便可将所有数字分为两组:

for(n=0;n<9999;n++){

    if(a[n]%fn==0)//fn指2的f+1次方

        ans1=ans1^a[n];

    if(a[n]%fn==1)

        ans2=ans2^a[n]};

最后ans1与ans2既为答案。

第五题:老板有根金条只能切两次,他准备用这根金条当作一个工人7天的工资,而且每天必须支付当天的工资,请问如何做到?

答案:两刀切成1/7,2/7,4/7,这样第一天给1/7,第二天给2/7,要回1/7,第三天再给1/7.。。。。

即工人手里:

第一天:1/7

第二天:2/7

第三天:1/7,2/7

第四天:4/7

第五天:1/7,4/7

第六天:2/7,4/7

第七天:1/7,2/7,4/7

第六题:给出任意长字符串:如ajabcad....dh,匹配是否含有另一短字符串,如:abcdab?不使用indexof。

其实很多算法题用js都可以很快的解除,如这道题,开始没有不使用indexof的限制。这里给大家kmp算法,他是一种复杂度0(n+m)的算法,为什么呢,就是因为普通算法匹配比如abcabcaa匹配abcaf到第四位发现不合适,依然需要从第二位再进行匹配字段,而kmp记录重复字段可以冲第四位再开始匹配了。这个网上有很多详细的图文甚至视频讲解,我这里就不赘叙,提供一个网上的js代码:js代码

第七题:给定一个字符串,如何快速的反转它?

这道题也有圈友回答出来用js分解然后使用reverse函数,然后再合并。其实这个回答是前端面试时,面试官觉得最简单最满意的答案。现在提供一种其他的方式:首先还是分解为数组的形式,然后,使用栈先进后出的特点,先:

a.push(a[n]);

全部入栈,然后:

array[i]=a.pop();

既完成。

总的来说,这周题目有点偏底层,都是2进制运算或者限制了使用js方法,并不像是前端面试的题目,接下来的面试题会向前端靠拢一点。

你可能感兴趣的:(3.6上周题目总结)