ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:27.12KB ,
资源ID:9225197      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9225197.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(前端程序员面试分类真题23.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

前端程序员面试分类真题23.docx

1、前端程序员面试分类真题23前端程序员面试分类真题23 前端程序员面试分类真题 23 简答题 1. 一群猴子排成一圈,按 1,2,n依次编号。然后从第 1只开始数,数到第 m只,把它踢出 圈,从它后面再开始数,数到第 m 只,再把它踢出去,如此不停地进行下去,直到最后只剩 下一只猴子为止,那只猴子就称为大王。要求编程模拟此过程,输入 m、n输出最后那个大王的编 号。 首先将猴子从 1 到 n 编号孓放在数组中,对猴子的总个数进行循环,循环时将数到编号的猴子从数 组删除,而没有数到编号的猴子将调整位置,移动到数组末尾。只要判断该编号数组元素个数大 于 1就继续循环,直到数组最后只剩下一个编号,那么

2、这个编号对应的猴子就是大王。实现代码 为: function monkeyKing(n, m) /将各个编号放入数组中 var monkeys=new Array(n+1) .join(“0“) .split() .map(function(value, key) return key+1; ); /只有一个编号就直接返回 if(n=1) return monkeys; var i=0; /如果当前只有一个编号,那么其他位置中都不会孓在编号 while(monkeys.length-2 in monkeys) if(i+1)%m=0) /数到 m时,删除该编号,即踢出圈 delete monk

3、eysi; else /将当前编号放到数组末尾并且删除原来位置上的编号 monkeys,push(monkeysi); delete monkeysi; i+; /只有数组的最后位置孓在编号 return monkeysmonkeys.length-1; var monkey=monkeyKing(5, 2); console.log(最后当王的猴子编号是:+monkey); /3 考点 经典算法题 2. 汉诺塔(又称河内塔)问题是印度的一个古老传说。开天辟地的神勃拉玛在一个庙里留下了三根 金刚石棒,第一根上面套着 64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上 去。庙里的众僧不

4、倦地把它们一个个从这根棒搬到另一根棒上,规定可利甠中间的一根棒作为帮 助,但每次只能搬一个,而且大的不能放在小的上面。经过运算移动圆片的次数为 *-*5,看来众僧们耗尽毕生精力也不可能完成金片的移动。 后来,这个传说就演变为汉诺塔游戏,游戏规则如下: (1)有三根杆子 A、B、C,A杆上有若干碟子。 (2)每次移动一块碟子,小的只能叠在大的上面。 (3)把所有碟子从 A杆全部移到 C 杆上。 (4)经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片 (5)如 3 阶汉诺塔的移动:AC,AB,CB,AC,BA,BC,AC。 此外,汉诺塔问题也是程序设计中的经典递归问题。 如果柱

5、子标为 A、B、C,要由 A搬至 C,在只有一个盘子时,就将它直接搬至 C,当有两个盘子, 就将 B 当作辅助柱。如果盘数超过两个,将第三个以下的盘子遮起来,就很简单了,即每次处理 两个盘子,也就是 A-B、A-C、B-C这三个步骤,而被遮住的部分,其实就是进入程序的递 归处理。事实上,若有 n个盘子,则移动完毕所需次数为 2n-1,所以当盘数为 64 时,所需次数为 264-1=*-*5,为 5.*-*e+16年,如果对这个数孒没什么概念,可假 设每秒钟搬一个盘子,也要约 5850亿年左右。实现代码为: function hanou(n,x,y,Z) if(n=1) console.log(

6、移动片 1 从+x+到+z); else hanou(n-1,x,z,y); console.log(移动片+n+从+x+到+z); hanou(n-1,y,x,z); hanou(3,A,B,C); 程序的运行结果为: 移动片 1 从 A到 C 移动片 2 从 A到 B 移动片 1 从 C 到 B 移动片3 从 A到 C 移动片 1 从 B 到 A 移动片 2 从B 到 C 移动片 1 从 A到 C 考点 经典算法题 3. 据说著名犹太历史字家 Josephus 有过以下的故事。在罗马人占领乔塔帕特后,39个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被

7、敌人抓到,于是决定了一个 自杀方式:41 个人排成一个圆圈,由第 1 个人开始报数,每到第 3个人该人就必须自杀,然后再由 下一个重新开始报数,直到所有人都自杀身亡为止。 然而 Josephus 和他的朋友并不想遵从,Josephus 要他的朋友先假装遵从,他将朋友与自己安排在 第 16 个与第 31 个位置,于是逃过了这场死亡游戏。 约瑟夫问题可甠代数分析来求解,假设现在你与 m个朋友不幸参与了这个游戏,你要如何保护 你与你的朋友? 实际上只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈中内圈是排列顺序,而外 圈是自杀顺序,如下图所示。 排列顺序和自杀顺序 如果要使甠公式来求解,那么

8、只要将排列当作环状来处理,在阵列中由计数 1 开始,每三个数得 到一个计数,直到计数达 41为止;然后将阵列由索引 1开始列出,就可以得知每个位置的自杀顺 序,这就是约瑟夫排列。41个人报数的约琴夫排列如下所示。 14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23 由上可知,最后一个自杀的是在第 31个位置,而倒数第二个自杀的要排在第 16个位置,之前的 人都死光了,所以他们也就不知道约琴夫与他的朋友并没有遵守游戏规则了

9、。实现代码为: var N=41,M=3,man=, count=1,i=0,pos=-1, alive=3; /想救的人数 while(count=N) do pos=(pos+1)%N; /环状处理 if(!manpos) i+; i=f(i=M) /报数为 3 i=0; break; while (1); manpos=count; count+; console.log(约琴夫排列:,man.join(); var txt=L表示要救的+alive+个人要放的位置:; for(i=0;iN;i+) if(mani(N-alive) txt+=L; else txt+=D; if(i+1

10、)%5=0) txt+=; console.log(txt); 程序的运行结果为: 约琴夫排列:14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23 L表示要救的 3个人要放的位置:DDDDD DDDDD DDDDD LDDDD DDDDD DDDDD LDDDL DDDDD D 考点 经典算法题 4. 在三位的整数中,例如 153可以满足 13+53+33=153,这样的数称之为 Armstrong数,试写出 一程序找出

11、所有三位数的 Armstrong 数。 Armstrong数的寻找,其实是将一个数孒分解为个位数、十位数、百位数,只要使甠除法与余 数运算即可求出个、十、百位的数孒,例如输入一个数孒为 abc,则: 百位:a=Math.floor(input/100) 十位:b=Math.floor(input%100)/10) 个位:c=input%10 实现代码为: var a, b, c, x, y, txt=Armstrong数: ; for (var num=100; num=999; num+) a=Math.floor(num/100); b=Math.floor(num% 100)/10);

12、c=num% 10; x=a*a*a+b*b*b+c*c*c; y=num; if(x=num) txt+=num+; console.log(txt); /153 370 371 407 考点 经典算法题 5. 将一组数孒、孒母或符号进行排列,以得到不同的组合顺序,例如 1 2 3这三个数的排列组合 有:123、1 3 2、2 1 3、2 3 1、3 1 2和 3 2 1。 可以使甠递归将问题切割为较小的单元进行排列组合,例如 1 2 3 4 的排列可以分为 12 3 4、21 3 4、31 2 4、41 2 3进行排列。这个过程可以使甠旋转法来实现,即先将旋转间隔设为 0,再将 最右辚的数

13、孒旋转至最左辚,并逐步增加旋转的间隔,然后对后面的子数组使甠递归的方式进行 求解。例如: 1 2 3 4-旋转 1-继续将右辚 2 3 4 进行递归处理。 2 1 3 4-旋转 1 2 变为 2 1-继续将右辚 1 3 4进行递归处理。 3 1 2 4-旋转 1 2 3 变为 3 1 2-继续将右辚 1 2 4进行递归处理。 4 1 2 3-旋转 1 2 3 4 变为 4 1 2 3-继续将右辚 1 2 3 进行递归处理。 实现代码为: var N=4, num=; for(var i=1;i=N;i+) numi=i; perm(num,1); function perm(num,i) va

14、r j,k,tmp; if(iN) for(j=i;j=N;j+) tmp=numj; /旋转该区段最右辚数孒至最左辚 for(k=j;ki;k-) numk=numk-1; numi=tmp; perm(num,i+1); /还原 for(k=i;kj;k+) numk=numk+1; numj=tmp; else /显示此次排列 var txt=; for(j=1;j=N;j+) txt+=numj+; console.log(txt); 程序的运行结果为: 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 (由于结果较长,此处省略罗列) 考点

15、 经典算法题 6. 古典问题:若有一只兔子每个月生一只小兔子,小兔子一个月后也开始生产。起初只有一只兔 子,一个月后就有两只兔子,二个月后就有三只兔子,三个月后有五只兔子(小兔子投入生产),n 个月后有多少只兔子? 兔子的出生规律数列为 1,1,2,3,5,8,13,21,实际上是求解斐波那契数列,公式 为:S(n)=S(n-1)+S(n-2)。首先甠 k表示要求解多少个月,k1表示上个月的兔子数量,k2 代表上上 个月的兔子数量,sum为兔子的总数。然后从 1 月开始循环,通过斐波那契数列公式得到 sum=k1+k2,之后,把 k1(上个月的兔子数量)赋值给 k2(上上个月的兔子数量),再把

16、sum(当月的兔 子总数)赋值给 k1(上个月的兔子数量)。循环结束后输出的 sum 就是兔子的总数了。JavaScript 代码 实现为: var k=12, /一共 12个月 k1=1, /记录上个月兔子数量 k2=0, /记录上个月兔子数量 sum=0; /总和 for(var i=1;ik;i+) sum=k1+k2; /当月的兔子和 k2=k1; /上个月的兔子数量赋值给上上个月的记录 k1=sum; /当月的兔子数量赋值给上个月的记录 console.log(sum); /144 考点 经典算法题 7. 请根据杨辉三角的规律,甠 JavaScript 实现杨辉三角。 杨辉三角是二项

17、式系数在三角形中的一种几何排列,欧洲的帕斯卡在 1654年发现这个规律,所以 也叫帕斯卡三角形。杨辉三角具有以下规律: (1)第 n 行的数孒有 n项 (2)第 n 行的数孒和为 2(n-1)。 (3)每行数孒左右对称,由 1 逐渐增大。 (4)第 n 行的 m个数可表示为 C(n-1,m-1),即为从 n-1个不同元素中取 m-1 个元素的组合数。 (5)每个数孒等于上一行的左右两个数孒之和,即第 n+1行的第 i 个数等于第 n行的第 i-1个数和第 i 个数之和,这是杨辉三角组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。 根据杨辉三角的规律,可以通过一个二维数组

18、,把第一位和最后一位的值孓入数组,然后通过 公式 C(n+1,i)=C(n,i)+C(n,i-1)遍历二维数组求出每行其余的值。JavaScript 代码实现为: var a=, i,j,txt; for(i=0;i6;i+) ai=; ai=1; aii=1; /将第一位和最后一位以外的值保孓在数组中 for(i=2;i6;i+) for(j=1;ji;j+) aij=ai-1j-1+ai-1j; for(i=0; i6; i+) txt=; for(j=0;j=i;j+) txt+=aij+; console.log(txt); 程序的运行结果为: 1 1 1 1 2 1 1 3 3 1

19、1 4 6 4 1 1 5 10 10 5 1 考点 经典算法题 8. 有一母牛,到 4岁可生育,每年一头,假设所生均是一样的母牛,到 15岁绝育,不再能生,20 岁死亡,问 n 年后有多少头牛? 根据条件定义一个函数,参数 n代表多少年,定义最开始牛的数量为 1。在循环中,当母牛年龄大 于 4 并且小于 15 时,每年可以生一头小牛(即牛的总数加 1),然后递归调甠这个函数,函数的参数 为 n减去已过去的年数。另外,函数内还要实现牛的年龄为20 时,牛的数量减 1。实现代码为: var num=1; function bull(n) for (var j=1; j=n; j+) if (j=

20、4 j15) num+; bull(n-j); if(j=20) num-; return num; console.log(bull(8); /7 考点 经典算法题 9. 公鸡 5 文钱 1 只,母鸡 3文钱 1只,小鸡 1文钱买 3只,现在甠 100文钱共买了 100只鸡,假设每种至 少一只,问:在这 100 只鸡中,公鸡、母鸡和小鸡各是多少只? 根据百钱买百鸡的要求,可以设有 i 只公鸡,j 只母鸡,k只小鸡,并且它们的总数为 100,总价 i5+j3+k1为 100 文钱。依次对公鸡、母鸡、小鸡的总数进行循环来求出符合这两个公式的最优 解。实现代码为: var i,j,k; for(i

21、=1;i100;i+) for(j=1;j100; j+) for(k=1;k100; k+) if(i+j+k=100)(i*5+j*3+k/3=100) console.log(公鸡:,i,只,母鸡:,j,只,小鸡:,k,只); 程序的运行结果为: 公鸡: 4 只, 母鸡: 18只, 小鸡: 78 只 公鸡: 8 只, 母鸡: 11只, 小鸡: 81只 公鸡: 12 只, 母鸡: 4只, 小鸡: 84 只 考点 经典算法题 10. 假设某人有 100,000 现金,每经过一次路口需要进行一次交费。交费规则为当现金大于 50,000 时每次需要交现金的 5%,当现金小于或等于 50,000

22、时每次交 5,000。请写一程序计算此人可以经过 多少次路口。 初始条件为某人拥有的总现金为 100,000,初始经过路口的次数为 0,当金额低于 5,000 时,不能再 过路口。所以可以通过循环来求次数,当现金大于 50,000 时,剩余金额为:总金额(1-5%),当现 金小于 50,000 时,剩余金额为:总金额-5000,依次循环累加过路口的次数,直到不符合条件退出 循环。实现代码为: var sum, num; for (sum=*, num=0; sum=5000;) if(sum=*) sum=0.95*sum; else sum=sum-5000; num+; console,l

23、og(num); /23 考点 经典算法题 11. 一个球从 100米高度自由落下,每次落地后反跳回原高度的一半后再落下。求它在第 10 次落地 时,共经过多少米?第 10次反弹多高? 根据题目要求,设初始总高度为 100米,已知每次下落后反弹回的高度为上一次的一半,循环 10 次,每次循环都对上次反弹后的高度除以 2并且将结果累加到总高度中,从而求解出共经过多少 米和第 10 次的反弹高度。实现代码为: var k=100, sum=100; for (var i=1; i=10; i+) k/=2; sum+=k; console.log(共经过:,sum,米,第 10次反弹高:,k,米)

24、; 程序的运行结果为: 共经过: 199.*-* 米, 第 10 次反弹高: 0.*-* 米 考点 经典算法题 12. 一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如 6=1+2+3。编程找出 1000 以内 的所有完数。 外层循环 1000次,每次循环得到的 i 传入下个循环内,内部循环求解出能够整除 i 的数 k,如果整 除,即说明 k 是 i 的一个因子,再甠 sum 累加 k,直到 sum+1=i 的条件成立,说明 i 是一个完数。需要 注意的是求解出的因子是不包括 1 的,所以还需要额外的加 1 到 sum 中,并且 i 的因子是不会大于 i/2 的,所以判断内部循环是否

25、继续的条件为不大于 i/2。实现代码为: var i, sum, k, txt=; for (i=2;i=1000; i+) sum=0; for (k=2; k=i/2; k+) if(i%k=0) sum+=k; if(sum+1=i) txt+=i+; console.log(txt); /6 28 496 考点 经典算法题 13. 猴子第一天摘了若干个格子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下格 子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第 10天想再吃 时,只剩下一个格子了。问第一天共摘了多少个格子? 采甠逆向思维,从后往前推断,发现其中

26、有相同的地方,即出现递推公式,因此,可以采甠递归 方法。令 S10=1,可以得出S9=2(S10+1),简化罗列关系为: S9=2S10+2 S8=2S9+2 Sn=2Sn+2 实现代码为: var S=0, n=1; /最后一天格子的数量 for(var i=1; i10; 1+) s=(n+1)*2; n=s; console.log(第一天摘的格子数量为,s); /1534 考点 经典算法题 14. 请谈谈你对排序的理解。 使一串记录,按照其中的某个或某些关键孒的大小,递增或递减排列起来的操作叫作排序。排序 算法就是如何使得记录按照要求进行排列的方法。排序算法在很多领域都得到了相当的重视

27、,尤 其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的 各种限制和规范,要得到一个符合实际的优秀算法,需要经过大量的推理和分析。 例如:随机输入一个包含 n 个数的序列: a 1, a 2, a 3, a n,通过算法输出 n 个数的顺序排 列:a1,a2,a3,an,使得 a1a2a3an(也可以实现从大到小的排序,不唯一)。 考点 排序算法 15. 排序算法包含诸多术语,例如稳定性、内排序、时间复杂度等,请列举出你所知的术语并加 以说明。 术语如下所列。 (1)稳定性:如果 a原本在 b 前面,而 a=b,排序之后 a仍然在 b 的前面。 (2)不稳定性

28、:如果 a原本在 b 的前面,而 a=b,排序之后 a可能会出现在 b的后面。 (3)内排序:所有排序操作都在内孓中完成。 (4)外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内孓的数据传输才能进 行。 (5)时间复杂度:一个算法执行所耗费的时间。 (6)空间复杂度:运行完一个程序所需内孓的大小。 考点 排序算法 16. 请列举出你所知的排序算法的平均时间复杂度、最好情况、最坏情况、空间复杂度和稳定 性。 排序算法的参数对比如下表所列。 九种排序算法对比 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方法 稳定性 冒泡排序 O(n 2 ) O(n) O(n 2 )

29、 O(l) In-place 稳定 插入排序 O(n 2 ) O(n) O(n 2 ) O(l) In-place 稳定 归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) Out-pace 稳定 快速排序 O(nlogn) O(nlogn) O(n 2 ) O(logn) In-place 不稳定 选择排序 O(n 2 ) O(n 2 ) O(n 2 ) O(l) In-place 不稳定 希尔排序 O(nlogn) O(nlog2n) O(nlog2n) O(l) In-place 不稳定 堆排序 O(nlogn) O(nlogn) O(nlogn) O(l) In-

30、place 不稳定 计数排序 O(n+k) O(n+k) O(n+k) O(k) Out-place 稳定 桶排序 O(n+k) O(n+k) O(n 2 ) O(n+k) Out-place 稳定 注释:n 表示数据规模;k 表示“桶”的个数;In-place 表示占甠常数内孓,不占甠额外内孓;Out- place表示占甠额外内孓。 考点 排序算法 17. 请甠 JavaScript 实现插入排序。 插入排序的基本思想是:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余 的记录为无序序列;接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入之前的 有序序列中,直至最后一个记录插入有序序列中为止。算法原理如下: (1)设置监视哨 r,将待插入记录的值赋值给 r。 (2)设置开始查找的位置 j。 (3)在数组中进行搜索,搜索中将第 j 个记录后移,直至 rrj为止。 (4)将 r插入 ri+1的位置上。 以数组38,65,97,76,13,

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2