web前端开发面试中常见的算法题(JS)

本文整理了web前端面试中常见的算法题,包括素数判断、斐波那契数列、最大公约数等,结合实例解析解题思路,帮助面试者提升算法能力。同时推荐了《剑指offer》和左神的算法课程作为学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在准备秋招,做过了大大小小的公司的面试题,发现除了基础知识外,算法还是挺重要的。特意整理了一些常见的算法题,添加了自己的理解并实现。

除此之外,建议大家还可以刷刷《剑指offer》(但我还没刷完?,任重道远呐)。此外,左神在牛客网上也有算法课程,听了基础班的感觉还不错,起码让我这个算法小白也能快速地理解了很多问题,知识付费的时代,这个真的是良心课程了。就我个人而言的话,平时为了解决一个算法问题,需要花很多时间去看帖子、看讲解,但很难真正转化为自己的思想(主要问题就是没有动手练),大家可以根据自己的需求,进行算法的学习。

话不多说,下面来看题。

目录

前言

1.验证一个数是否是素数

2.斐波那契

3.求最大公约数

4.数组去重

5.删除重复的字符

6.排序两个已经排好序的数组

7.字符串反向

8.字符串原位反转

9.判断是否是回文

10.判断数组中是否有两数之和

11.连字符转成驼峰

12.最长公共前缀

13.加油站问题-贪心算法

14.用正则实现trim() 清除字符串两端空格

15.岛问题:判断有几个岛

16.将数字12345678转化成RMB形式:12,345,678

17.删除相邻相同的字符串

18.宣讲会安排

19.汉诺塔问题

20.母牛生母牛问题

21.切割金条-贪心算法


1.验证一个数是否是素数

  • 如果这个数是 2 或 3,一定是素数;
  • 如果是偶数,一定不是素数;
  • 如果这个数不能被3~它的平方根中的任一数整除,m必定是素数。而且除数可以每次递增2(排除偶数)
function isPrime(num){
	if (num === 2 || num === 3) {
		return true;
	};
	if (num % 2 === 0) {
		return false;
	};
	let divisor = 3,limit = Math.sqrt(num);
	while(limit >= divisor){
		if (num % divisor === 0) {
			return false;
		}
		else {
			divisor += 2;
		}
	}
	return true;
}
console.log(isPrime(30));  // false

2.斐波那契

  • 最简单的做法:递归。
function fibonacci(n){
	if (n <= 0) {
		return 0;
	}
	if (n == 0) {
		return 1;
	}
	return fibonacci(n-1) + fibonacci(n-2);
}

但是递归会有严重的效率问题。比如想要求得f(10),首先需要求f(9)和f(8)。同样,想求f(9),首先需要f(8)和f(7)…这样就有很多重复值,计算量也很大。

  • 改进:从下往上计算,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3)……以此类推就可以计算出第n项。时间复杂度O(n)。
function fibonacci(n){
	let ori = [0,1];
	if (n < 2) {
		return ori[n];
	};
	let fiboOne = 1,fiboTwo = 0,fiboSum = 0;
	for (let i = 2; i < n; i++) {
		fiboSum = fiboOne + fiboTwo;
		fiboTwo = fiboOne;
		fiboOne = fiboSum;
	}
	return fiboSum;
}
console.log(fibonacci(5));

3.求最大公约数

  • 除数 在a和b的范围内,如果同时a和b处以除数的余等于0,就将此时的除数赋值给res;除数自增,不断循环上面的计算,更新res。
function greatestCommonDivisor(a, b){
	let divisor = 2,res = 1;
	if (a < 2 || b < 2) {
		return 1;
	};
	while(a >= divisor && b >= divisor){
		if (a%divisor === 0 && b%divisor === 0) {
			res = divisor;
		}
		divisor++;
	}
	return res;
};
console.log(greatestCommonDivisor(8, 4)); // 4
console.log(greatestCommonDivisor(69, 169)); // 1
  • 解法2:
function greatestCommonDivisor(a,b){
	if (b === 0) {
		return a;
	} else {
		return greatestCommonDivisor(b,a%b);
	}
};

4.数组去重

  • 对原数组进行遍历
    • 获取arr[i]的值 j;
    • 对应到辅助数组 exits 的位置 j 的值,如果没有,则证明arr[i] 的值没有重复,此时将 值j 存入res数组,并将辅助数组 j 位置的值置为 true。
  • 最后返回res数组。
function removeDuplicate(arr){
	if (arr === null || arr.length < 2) {
		return arr;
	};
	let res = [],exits = [];
	for(let i = 0; i < arr.length; i++){
		let j = arr[i];
		while( !exits[j] ){
			res.push(arr[i]);
			exits[j] = true;
		}
	}
	return res;
}
console.log(removeDuplicate([1,3,3,3,1,5,6,7,8,1]))  // [1,3,5,6,7,8]

5.删除重复的字符

这一题的解法和上一题类似。

function removeDuplicateChar(str){
	if (!str || str.length < 2 || typeof str != "string") {
		return;
	};
	let charArr = [],res = [];
	for(let i = 0; i < str.length; i++){
		let c = str[i];
		if(charArr[c]){
			charArr[c]++;
		}
		else{
			charArr[c] = 1;
		}
	}
	for(let j in charArr){
		if (charArr[j] === 1) {
			res.push(j);
		}
	}
	return res.join("");
}
console.log(removeDuplicateChar("Learn more java
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值