掌握

常见的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)

  1. // Base
  2. function Fibonacci1(n) {
  3. if (n === 1) {
  4. return 1
  5. }
  6. if (n === 2) {
  7. return 1
  8. }
  9. if (n > 2) {
  10. return Fibonacci1(n - 1) + Fibonacci1(n - 2)
  11. }
  12. }
  13. // More
  14. function Fibonacci2(n) {
  15. if (n === 1 || n === 2) {
  16. return 1
  17. } else {
  18. var pre = 1
  19. var next = 1
  20. var target
  21. for (var i = 3; i <= n; i++) {
  22. target = pre + next
  23. pre = next
  24. next = target
  25. }
  26. return target
  27. }
  28. }
  29. var start = new Date().getTime()
  30. console.log(Fibonacci1(30)) // 832040
  31. var end = new Date().getTime()
  32. console.log(end - start) // 43
  33. start = new Date().getTime()
  34. console.log(Fibonacci2(30)) // 832040
  35. end = new Date().getTime()
  36. console.log(end - start) // 0

上述写了实现斐波那契数列的两种方法,第一种方法用了递归;第二种方法用了循环赋值;通过上述实践,可以看出第二种方式的时间空间复杂度很小很小。所以,在此推荐用第二种方法实现斐波那契数列

2、字符串反转


  1. var strChar = 'wangsuoling'
  2. // Base
  3. function strReserve1 (str) {
  4. if (typeof str !== 'string') {
  5. return false
  6. } else {
  7. var result = ''
  8. // 字符串通过索引取值,IE7及其以前的版本不支持
  9. for (var i = str.length - 1; i >= 0 ; i--) {
  10. result += str[i]
  11. }
  12. return result
  13. }
  14. }
  15. // More
  16. function strReserve2 (str) {
  17. if (typeof str !== 'string') {
  18. return false
  19. } else {
  20. let strNew = str.split('').reverse().join('')
  21. return strNew
  22. }
  23. }
  24. var start = new Date().getTime()
  25. console.log(strReserve1(strChar)) // 'gnilousgnaw'
  26. var end = new Date().getTime()
  27. console.log(end - start) // 0
  28. start = new Date().getTime()
  29. console.log(strReserve2(strChar)) // 'gnilousgnaw'
  30. end = new Date().getTime()
  31. console.log(end - start) // 0

上述写了实现字符串反转的两种方法,通过上述实践,可以看出第二种方式的时间空间复杂度很小很小。所以,在此推荐用第二种方法实现字符串反转

3、判断字符串是否是回文

  1. var str1 = 'abeffeba'
  2. var str2 = 'abcdcba'
  3. var str3 = 'abcd1234'
  4. // Base
  5. function huiWen1 (str) {
  6. for (let i = 0; i < str.length; i++) {
  7. if (str[i] === str[str.length - 1 - i]) {
  8. return true
  9. } else {
  10. return false
  11. }
  12. }
  13. }
  14. // Middle--利用栈 后进先出的特性
  15. function huiWen2 (str) {
  16. var stackNewArr = [], len, mid, next, top
  17. len = str.length
  18. mid = Math.floor(len / 2 - 1)
  19. top = 0
  20. for (var i = 0; i <= mid; i++) {
  21. stackNewArr[++top] = str[i]
  22. }
  23. if (len % 2 === 0) {
  24. next = mid + 1
  25. } else {
  26. next = mid + 2
  27. }
  28. for (var j = next; j <= len-1; j++) {
  29. if (str[j] !== stackNewArr[top]) {
  30. break
  31. }
  32. top--
  33. }
  34. if (top === 0) {
  35. return true
  36. } else {
  37. return false
  38. }
  39. }
  40. // More
  41. function huiWen3 (str) {
  42. let strNew = str.split('').reverse().join('')
  43. if (strNew === str) {
  44. return true
  45. } else {
  46. return false
  47. }
  48. }
  49. var start = new Date().getTime()
  50. console.log(huiWen1(str2)) // true
  51. var end = new Date().getTime()
  52. console.log(end - start) // 0
  53. start = new Date().getTime()
  54. console.log(huiWen2(str2)) // true
  55. end = new Date().getTime()
  56. console.log(end - start) // 0
  57. start = new Date().getTime()
  58. console.log(huiWen3(str2)) // 'gnilousgnaw'
  59. end = new Date().getTime()
  60. console.log(end - start) // 0

4、数组去重

  1. // 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr中的元素能够在temp中找到,则跳过此元素,否则将此元素存入temp,最后返回temp
  2. // Base
  3. function unique(arr){
  4. var temp = [];
  5. var len = arr.length;
  6. for(var i = 0; i < len; i++){
  7. if(temp.indexOf(arr[i]) === -1) temp.push(arr[i]);
  8. }
  9. return temp;
  10. }
  11. // 思路:遍历要去重的数组arr, 循环判断当前元素的索引和从数组尾部查询的索引是否一致,不一致的情况,说明有重复项,则根据尾部的索引删除
  12. function unique(arr){
  13. for(var i=0;i<arr.length;i++){
  14. var lastIndex = arr.lastIndexOf(arr[i]
  15. while(arr.indexOf(arr[i]) != lastIndex){
  16. arr.splice(lastIndex,1)
  17. }
  18. }
  19. return arr
  20. }

二、您需要的前端面试算法(上)

1、数组遍历

2、字符串替换

3、链表逆序打印

4、重建二叉树

5、栈与队列的互相实现

6、旋转数组的最小数字

7、斐波那契数列

8、位运算

9、数值的整数次方

10、删除链表节点

11、调整数组顺序

12、链表中导数第k个结点

13、反转链表

14、合并两个排序的链表

15、二叉树的包含

16、二叉树的镜像

17、顺时针打印矩阵

三、前端笔试&面试爬坑系列—-算法

1、排序

练习:

前端面试必备-40道LeetCode经典面试算法题

了解:

贪心算法

分治算法

动态规划