JS高频算法面试题及详细答案(真实面试版)_第1页
JS高频算法面试题及详细答案(真实面试版)_第2页
JS高频算法面试题及详细答案(真实面试版)_第3页
JS高频算法面试题及详细答案(真实面试版)_第4页
JS高频算法面试题及详细答案(真实面试版)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JS高频算法面试题及详细答案(真实面试版)本次题库精选前端面试必考JS算法题,从基础到进阶,每题包含题目、解题思路、完整代码、答案解析,无冗余话术,完全贴合企业真实面试出题逻辑,适合刷题、复盘面试考点。一、基础算法(入门必考)1、题目:斐波那契数列(求第n项值)题目描述:斐波那契数列规则:1、1、2、3、5、8、13...从第三项开始,每一项等于前两项之和。编写函数,输入n,返回数列第n项的值。解题思路:边界判断:n为1、2时,直接返回1递归写法:拆解问题,第n项=第n-1项+第n-2项迭代写法:避免递归栈溢出,性能更优,面试优先推荐完整代码(迭代最优解)javascript

functionfib(n){

//边界处理

if(n<=0)return0;

if(n===1||n===2)return1;

//初始化前两项

leta=1,b=1,res=0;

//从第三项开始遍历计算

for(leti=3;i<=n;i++){

res=a+b;

a=b;

b=res;

}

returnres;

}

//测试

console.log(fib(6));//输出8答案解析:递归写法简单但n过大时会重复计算、导致栈溢出;迭代写法时间复杂度O(n),空间复杂度O(1),性能最优,是面试标准答案。2、题目:判断一个数是否为素数(质数)题目描述:素数定义:大于1的自然数,除了1和自身外,无法被其他自然数整除。编写函数判断输入数字是否为素数。解题思路:小于2的数直接不是素数2是唯一的偶数素数大于2的偶数直接排除只需遍历到数字的平方根,减少循环次数,优化性能完整代码javascript

functionisPrime(num){

//小于2不是素数

if(num<2)returnfalse;

//2是素数

if(num===2)returntrue;

//偶数直接排除

if(num%2===0)returnfalse;

//遍历到平方根,步长2(只判断奇数)

constsqrtNum=Math.sqrt(num);

for(leti=3;i<=sqrtNum;i+=2){

if(num%i===0)returnfalse;

}

returntrue;

}

//测试

console.log(isPrime(17));//true

console.log(isPrime(15));//false答案解析:常规写法会遍历到num-1,效率极低;优化后遍历到平方根,时间复杂度从O(n)降到O(√n),是面试认可的优化写法。二、字符串算法(面试高频)3、题目:字符串反转题目描述:编写函数,输入字符串,返回反转后的字符串,禁止使用reverse直接反转(面试常考手写原理)。解题思路:循环从字符串末尾遍历,逐个拼接字符,实现反转。完整代码(手写原生版)javascript

functionreverseStr(str){

letresult='';

//从最后一位向前遍历

for(leti=str.length-1;i>=0;i--){

result+=str[i];

}

returnresult;

}

//测试

console.log(reverseStr('hello'));//olleh答案解析:基础API写法(split('').reverse().join(''))可以实现,但面试会要求手写底层逻辑,循环遍历是核心考点。4、题目:统计字符串中出现次数最多的字符题目描述:输入一串字符串,找出出现次数最多的字符,若次数相同,返回最先出现的字符。解题思路:用对象存储字符出现次数,键为字符,值为次数遍历字符串,统计所有字符次数再次遍历,匹配最大次数,记录结果完整代码javascript

functiongetMaxChar(str){

//空字符串判断

if(!str)return'';

constobj={};

letmaxNum=0;

letmaxChar='';

//统计字符次数

for(letcharofstr){

obj[char]=obj[char]?obj[char]+1:1;

}

//遍历找出最大值

for(letkeyinobj){

if(obj[key]>maxNum){

maxNum=obj[key];

maxChar=key;

}

}

return{char:maxChar,count:maxNum};

}

//测试

console.log(getMaxChar('aabbccddd'));//{char:'d',count:3}答案解析:利用对象哈希存储,时间复杂度O(n),是前端处理字符统计的通用方案,适配绝大多数同类题型。5、题目:去除字符串重复字符题目描述:手写函数,去除字符串中重复字符,保留首次出现顺序。完整代码javascript

functionuniqueStr(str){

letres='';

for(letcharofstr){

//不存在则拼接

if(!res.includes(char)){

res+=char;

}

}

returnres;

}

//测试

console.log(uniqueStr('aabbbccddee'));//abcde三、数组算法(重中之重)6、题目:数组去重(手写四种常用方法)题目描述:手写数组去重,面试常考原生实现,不依赖newSet简化写法(需掌握底层)。方法1:双重循环(基础必背)javascript

functionuniqueArr1(arr){

constres=[];

for(leti=0;i<arr.length;i++){

letflag=true;

for(letj=0;j<res.length;j++){

if(arr[i]===res[j]){

flag=false;

break;

}

}

if(flag)res.push(arr[i]);

}

returnres;

}方法2:indexOf简化javascript

functionuniqueArr2(arr){

returnarr.filter((item,index)=>{

returnarr.indexOf(item)===index;

});

}答案解析:indexOf会返回元素第一次出现的索引,当前索引和首次索引一致则保留,实现去重;Set写法([...newSet(arr)])适合业务使用,面试优先写循环实现。7、题目:数组扁平化(多维数组转一维)题目描述:手写函数,将多维嵌套数组(不限层级)转为一维数组,如[1,[2,[3,4],5]]=>[1,2,3,4,5]。解题思路:递归遍历,判断元素是否为数组,是则递归拆解,否则存入结果。完整代码(递归万能版)javascript

functionflattenArr(arr){

letres=[];

arr.forEach(item=>{

if(Array.isArray(item)){

//递归拼接扁平化后的数组

res=res.concat(flattenArr(item));

}else{

res.push(item);

}

});

returnres;

}

//测试

console.log(flattenArr([1,[2,[3,4],5],6]));//[1,2,3,4,5,6]答案解析:可处理任意层级数组,是面试高频手写题;ES6flat(Infinity)为API写法,面试需手写递归原理。8、题目:两数之和题目描述:给定一个整数数组和一个目标值,找出数组中两个相加等于目标值的索引,返回索引数组,假设每组输入只有一个答案。完整代码(哈希优化版)javascript

functiontwoSum(nums,target){

constmap=newMap();

for(leti=0;i<nums.length;i++){

//计算需要匹配的差值

constdiff=target-nums[i];

if(map.has(diff)){

//找到匹配值,返回索引

return[map.get(diff),i];

}

//存储当前值和索引

map.set(nums[i],i);

}

return[];

}

//测试

console.log(twoSum([2,7,11,15],9));//[0,1]答案解析:暴力双重循环时间复杂度O(n²),哈希解法O(n),是面试标准最优解。四、排序算法(前端核心手写)9、题目:手写冒泡排序题目描述:原生手写冒泡排序,实现数组从小到大排序。解题思路:相邻元素两两对比,前大于后则交换位置,每轮循环将最大值冒泡到末尾。完整代码javascript

functionbubbleSort(arr){

constlen=arr.length;

//外层控制循环轮数

for(leti=0;i<len-1;i++){

//内层两两对比,每轮减少一次循环(末尾已排序)

for(letj=0;j<len-1-i;j++){

if(arr[j]>arr[j+1]){

//交换位置

[arr[j],arr[j+1]]=[arr[j+1],arr[j]];

}

}

}

returnarr;

}

//测试

console.log(bubbleSort([3,1,4,2,5]));//[1,2,3,4,5]10、题目:手写快速排序题目描述:手写快排,前端面试必考排序算法,性能优于冒泡。解题思路:选取基准值,将数组分为小于、大于基准值的两个子数组,递归拼接排序结果。完整代码javascript

functionquickSort(arr){

//递归终止条件

if(arr.length<=1)returnarr;

//选取中间基准值

constmidIndex=Math.floor(arr.length/2);

constmidVal=arr.splice(midIndex,1)[0];

constleft=[];

constright=[];

//遍历分组

for(letitemofarr){

item<midVal?left.push(item):right.push(item);

}

//递归拼接

returnquickSort(left).concat(midVal,quickSort(right));

}

//测试

console.log(quickSort([5,2,9,1,5,6]));//[1,2,5,5,6,9]答案解析:快排平均时间复杂度O(nlogn),是实际开发最常用的排序算法,面试必须熟练手写。五、进阶递归与逻辑题11、题目:阶乘计算题目描述:n的阶乘=1*2*3*...*n,0和1的阶乘为1,手写递归+迭代两种解法。递归解法javascript

functionfactorial(n){

if(n===0||n===1)return1;

returnn*factorial(n-1);

}迭代解法javascript

functionfactorial2(n){

letres=1;

for(leti=2;i<=n;i++){

res*=i;

}

returnres;

}

/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论