[关闭]
@1002522146 2018-08-09T02:58:13.000000Z 字数 2608 阅读 788

面试的一些 JavaScript 算法

面试题


排序算法

  1. const arr = [16, 31, 12, 1, 9, 23, 10]
  2. function bubbleSort (arr) {
  3. for (let i = 0; i < arr.length - 1; i++) {
  4. for (let j = 0; j < arr.length - i - 1; j++) {
  5. if (arr[j] > arr[j+1])
  6. // 为了避免引入一个中间变量
  7. // 这里用了 ES6 的结构赋值
  8. [ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ]
  9. }
  10. }
  11. return arr
  12. }
  13. bubbleSort(arr) // [1, 9, 10, 12, 16, 23, 31]
  1. const arr = [16, 31, 12, 1, 9, 23, 10]
  2. function quickSort (arr) {
  3. if (arr.length <= 1) return arr
  4. const middleIndex = Math.floor(arr.length / 2)
  5. const middle = arr.splice(middleIndex, 1)
  6. const left = []
  7. const right = []
  8. arr.forEach(v => {
  9. if (v < middle[0]) left.push(v)
  10. else right.push(v)
  11. })
  12. return quickSort(left).concat(middle, quickSort(right))
  13. }
  14. quickSort(arr) // [1, 9, 10, 12, 16, 23, 31]

找出整型数组中乘积最大的三个数

  1. const unsortedArray = [-10, 7, 29, 30, 5, -10, -70]
  2. // 乘积最大的只有可能是两种情况:
  3. // 1. 最大的三个数的乘积
  4. // 2. 最大的数和最小的两个数的乘积
  5. function multiply (unsortedArr) {
  6. // 从小到大排序
  7. const arr = unsortedArr.sort((a, b) => a - b)
  8. const length = arr.length
  9. // 计算两种情况的值
  10. result1 = arr[length - 1] * arr[length - 2] * arr[length - 3]
  11. result2 = arr[0] * arr[1] * arr[length - 1]
  12. return result1 > result2 ? result1 : result2
  13. }
  14. multiply(unsortedArray) // 21000

数组去重

给定某无序数组,要求去除数组中的重复数字并且返回新的无重复数组。

  1. const arr = [1, 2, '1', null, undefined, null, undefined]
  2. // ES6 Set 和 Spread 操作符
  3. function uniqueArray (arr) {
  4. return [...new Set(arr)]
  5. }
  6. // ES5
  7. function uniqueArray (arr) {
  8. return arr.filter((v, i) => arr.indexOf(v) === i)
  9. }
  10. uniqueArray(arr) // [1, 2, '1', null, undefined]

回文字符串的判定

  1. function isPalindrome(word) {
  2. return word === word.split('').reverse().join('')
  3. }
  4. isPalindrome('racecar') // true

函数柯里化

此处输入链接的描述

  1. function sum() {
  2. var num = arguments[0];
  3. console.log(num)
  4. if(arguments.length === 2) {
  5. return arguments[0] + arguments[1]
  6. } else {
  7. return function(sec) {
  8. return num + sec;
  9. }
  10. }
  11. }

斐波那契数列(1,1,2,3,5,8)

  1. //第n项对应的数值。
  2. function com(n) {
  3. if (n <= 0) return 0;
  4. if (n == 1) return 1;
  5. return com(n - 1) + com(n - 2);
  6. }
  7. //前n项之和。
  8. function sum(n) {
  9. if (n == 1) return 1;
  10. if (n < 1) return 0;
  11. return com(n) + sum(n -1);
  12. }

深拷贝

  1. function deepClone(initalObj, finalObj) {
  2. var obj = finalObj || {};
  3. for (var i in initalObj) {
  4. if (typeof initalObj[i] === 'object') {
  5. obj[i] = (initalObj[i].constructor === Array) ? [] : {};
  6. arguments.callee(initalObj[i], obj[i]);
  7. } else {
  8. obj[i] = initalObj[i];
  9. }
  10. }
  11. return obj;
  12. }
  13. var str = {};
  14. var obj = { a: {a: "hello", b: 21} };
  15. deepClone(obj, str);
  16. console.log(str.a);
  17. --------------
  18. function deepClone(initalObj, finalObj) {
  19. var obj = finalObj || {};
  20. for (var i in initalObj) {
  21. var prop = initalObj[i]; // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
  22. if(prop === obj) {
  23. continue;
  24. }
  25. if (typeof prop === 'object') {
  26. obj[i] = (prop.constructor === Array) ? [] : {};
  27. arguments.callee(prop, obj[i]);
  28. } else {
  29. obj[i] = prop;
  30. }
  31. }
  32. return obj;
  33. }
  34. var str = {};
  35. var obj = { a: {a: "hello", b: 21} };
  36. deepClone(obj, str);
  37. console.log(str.a);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注