- 掌握
- 常见的JavaScript面试算法">一、常见的JavaScript面试算法
- 二、您需要的前端面试算法(上)">二、您需要的前端面试算法(上)
- 1、数组遍历">1、数组遍历
- 2、字符串替换">2、字符串替换
- 3、链表逆序打印">3、链表逆序打印
- 4、重建二叉树">4、重建二叉树
- 5、栈与队列的互相实现">5、栈与队列的互相实现
- 6、旋转数组的最小数字">6、旋转数组的最小数字
- 7、斐波那契数列">7、斐波那契数列
- 8、位运算">8、位运算
- 9、数值的整数次方">9、数值的整数次方
- 10、删除链表节点">10、删除链表节点
- 11、调整数组顺序">11、调整数组顺序
- 12、链表中导数第k个结点">12、链表中导数第k个结点
- 13、反转链表">13、反转链表
- 14、合并两个排序的链表">14、合并两个排序的链表
- 15、二叉树的包含">15、二叉树的包含
- 16、二叉树的镜像">16、二叉树的镜像
- 17、顺时针打印矩阵">17、顺时针打印矩阵
- 三、前端笔试&面试爬坑系列—-算法">三、前端笔试&面试爬坑系列—-算法
- 练习:
- 了解:
掌握
常见的JavaScript面试算法
您需要的前端面试算法(上)
前端笔试&面试爬坑系列—-算法
前端面试必备-40道LeetCode经典面试算法题
二叉树
排序
数据结构
一、常见的JavaScript面试算法
1、斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……..
这个数列从第3项开始,每一项都等于前两项之和。
斐波那契数列的定义者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci)
// Base
function Fibonacci1(n) {
if (n === 1) {
return 1
}
if (n === 2) {
return 1
}
if (n > 2) {
return Fibonacci1(n - 1) + Fibonacci1(n - 2)
}
}
// More
function Fibonacci2(n) {
if (n === 1 || n === 2) {
return 1
} else {
var pre = 1
var next = 1
var target
for (var i = 3; i <= n; i++) {
target = pre + next
pre = next
next = target
}
return target
}
}
var start = new Date().getTime()
console.log(Fibonacci1(30)) // 832040
var end = new Date().getTime()
console.log(end - start) // 43
start = new Date().getTime()
console.log(Fibonacci2(30)) // 832040
end = new Date().getTime()
console.log(end - start) // 0
上述写了实现斐波那契数列的两种方法,第一种方法用了递归
;第二种方法用了循环赋值
;通过上述实践,可以看出第二种方式的时间空间复杂度很小很小
。所以,在此推荐用第二种方法
实现斐波那契数列
2、字符串反转
var strChar = 'wangsuoling'
// Base
function strReserve1 (str) {
if (typeof str !== 'string') {
return false
} else {
var result = ''
// 字符串通过索引取值,IE7及其以前的版本不支持
for (var i = str.length - 1; i >= 0 ; i--) {
result += str[i]
}
return result
}
}
// More
function strReserve2 (str) {
if (typeof str !== 'string') {
return false
} else {
let strNew = str.split('').reverse().join('')
return strNew
}
}
var start = new Date().getTime()
console.log(strReserve1(strChar)) // 'gnilousgnaw'
var end = new Date().getTime()
console.log(end - start) // 0
start = new Date().getTime()
console.log(strReserve2(strChar)) // 'gnilousgnaw'
end = new Date().getTime()
console.log(end - start) // 0
上述写了实现字符串反转的两种方法,通过上述实践,可以看出第二种方式的时间空间复杂度很小很小
。所以,在此推荐用第二种方法
实现字符串反转
3、判断字符串是否是回文
var str1 = 'abeffeba'
var str2 = 'abcdcba'
var str3 = 'abcd1234'
// Base
function huiWen1 (str) {
for (let i = 0; i < str.length; i++) {
if (str[i] === str[str.length - 1 - i]) {
return true
} else {
return false
}
}
}
// Middle--利用栈 后进先出的特性
function huiWen2 (str) {
var stackNewArr = [], len, mid, next, top
len = str.length
mid = Math.floor(len / 2 - 1)
top = 0
for (var i = 0; i <= mid; i++) {
stackNewArr[++top] = str[i]
}
if (len % 2 === 0) {
next = mid + 1
} else {
next = mid + 2
}
for (var j = next; j <= len-1; j++) {
if (str[j] !== stackNewArr[top]) {
break
}
top--
}
if (top === 0) {
return true
} else {
return false
}
}
// More
function huiWen3 (str) {
let strNew = str.split('').reverse().join('')
if (strNew === str) {
return true
} else {
return false
}
}
var start = new Date().getTime()
console.log(huiWen1(str2)) // true
var end = new Date().getTime()
console.log(end - start) // 0
start = new Date().getTime()
console.log(huiWen2(str2)) // true
end = new Date().getTime()
console.log(end - start) // 0
start = new Date().getTime()
console.log(huiWen3(str2)) // 'gnilousgnaw'
end = new Date().getTime()
console.log(end - start) // 0
4、数组去重
// 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr中的元素能够在temp中找到,则跳过此元素,否则将此元素存入temp,最后返回temp
// Base
function unique(arr){
var temp = [];
var len = arr.length;
for(var i = 0; i < len; i++){
if(temp.indexOf(arr[i]) === -1) temp.push(arr[i]);
}
return temp;
}
// 思路:遍历要去重的数组arr, 循环判断当前元素的索引和从数组尾部查询的索引是否一致,不一致的情况,说明有重复项,则根据尾部的索引删除
function unique(arr){
for(var i=0;i<arr.length;i++){
var lastIndex = arr.lastIndexOf(arr[i]
while(arr.indexOf(arr[i]) != lastIndex){
arr.splice(lastIndex,1)
}
}
return arr
}