今天将对上周发布的几道面试题进行总结:
第一题:一段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方法,并不像是前端面试的题目,接下来的面试题会向前端靠拢一点。
网友评论