JavaScript面试题库

一、编码(初级)

 1.isPrime - 返回truefalse, 表示输入的数是否为质数

 1 /**
 2  * 判断一个数是否为质数
 3  * @param num
 4  */
 5 function isPrime(num) {
 6   if (num === 2 || num === 3 || num === 5) {
 7     return true;
 8   }
 9   if (num < 2 || !isInteger(num) || !isNum(num) || !isDual(num)) {
10     return false;
11   }
12   for (var i = 2; i < num / 2 + 1; i++) {
13     if (num % i === 0) {
14       return false;
15     }
16   }
17   return true;
18 }
19 
20 /**
21  * 判断是否是整数
22  */
23 function isInteger (num) {
24   return num === ~~num ? true : false;
25 }
26 
27 /**
28  * 判断是否是数字
29  */
30 function isNum (num) {
31   return num === +num ? true : false;
32 }
33 
34 /**
35  * 判断数字末尾是否是2或者5
36  */
37 function isDual (num) {
38   var num  = num.toString();
39   var lastNum = num.substring(num.length - 1, num.length);
40   return lastNum %2 === 0 || lastNum % 5 === 0 ? false : true;
41 }

 2.factorial - 返回给定数的阶乘的值

1 /**
2  * 返回指定数的阶乘
3  * @param n
4  */
5 function factorial(n) {
6   return n > 1 ? n * factorial(n - 1) : n
7 }

3.fib -返回斐波那契数列的前n项的和(n为给定)

 1 /**
 2  * 返回斐波那契数列的前n项的和(n为给定)
 3  * @param n
 4  */
 5 function fibSum(n) {
 6   return n > 1 ? fib(n) + fibSum(n - 1) : fib(n)
 7 }
 8 
 9 /**
10  * 返回斐波那契数列的第n项
11  * @param n
12  */
13 function fib (n) {
14   return (n === 1 || n === 2) ? 1 : fib(n - 1) + fib(n - 2)
15 }

4.isSorted - 返回truefalse,表示给定的数组是否被排序过

 1 /**
 2  * 表示给定的数组是否被排序过
 3  * @param arr
 4  * @returns {boolean}
 5  */
 6 function isSorted(arr) {
 7   return (arr.toString() === arr.sort().toString())
 8       || (arr.toString() === arr.sort((a, b) => {return b > a}).toString())
 9       ? true : false
10 }

5.filter - 实现过滤器功能(filter([1, 2, 3, 4], n => n < 3)    // [1, 2])

 1 /**
 2  * 实现数组过滤功能
 3  */
 4 Array.prototype.filterT = Array.prototype.filterT || function (func) {
 5   var arr = this, brr = [];
 6   for (var i = 0; i < arr.length; i++) {
 7     if (func(arr[i])) {
 8       brr.push(arr[i])
 9     }
10   }
11   return brr;
12 }

6.reduce- 实现reduce 函数

 1 /**
 2  * 实现reduce函数
 3  */
 4 Array.prototype.reduceT = Array.prototype.reduceT || function (func) {
 5   var arr = this, sum = arr[0];
 6   for (var i = 1; i < arr.length; i++) {
 7     sum = func(sum, arr[i]);
 8   }
 9   return sum
10 }

7.reverse- 反转给定字符串 (用已封装好的 reverse 是一个cheat,要自己实现)

1 /**
2  * 反转字符串
3  */
4 function reverse(str) {
5   return str.split("").reverse().join("")
6 }

8.indexOf - 实现数组的 indexOf方法

 1 /**
 2  * 实现数组的 indexOf方法
 3  * @type {*|Function}
 4  */
 5 Array.prototype.indexOfT = Array.prototype.indexOfT || function (b) {
 6   var arr = this;
 7   for (var i = 0; i < arr.length; i++) {
 8       if(arr[i] === b) return i;
 9   }
10   return -1;
11 }

9.isPalindrome - 返回true或false判断给定字符串是否是一个回文(palindrome)(大小写不敏感)

1 /**
2  * isPalindrome - 返回true或false判断给定字符串是否是一个回文(palindrome)(大小写不敏感)
3  * @param str
4  */
5 
6 function isPalindrome(str) {
7   return str.toUpperCase() === str.split('').reverse().join('').toUpperCase() ? true : false;
8 }

10.isBalanced - 用truefalse表示给定的字符串的花括号是否平衡(一一对应)

 1 /**
 2  * 用true或false表示给定的字符串的花括号是否平衡(一一对应)
 3  * @param str
 4  */
 5 function isBalanced(str) {
 6   var num1 = 0, num2 = 0, arr = str.split('');
 7   for (var i = 0; i < arr.length; i++) {
 8     if (arr[i] === '{') num1++;
 9     if (arr[i] === '}') num2++;
10   }
11   return num1 === num2 ? true : false
12 }

二、编码(中级)

1.fib2 - 实现像上面的fib函数一样的功能,但是要能够算出数列中前50位以上的数的和。(小提示: 从内存中查询)

2.isBalanced2 - 实现同上面的isBalanced函数相同的功能,但是要支持三种类型的括号{},[],和()。带有交错括号的字符串应该返回false。

3.uniq - 选取一个由数字组成的数组,为其去重,返回去重后的数组。可以实现出时间复杂度为O(n)的算法吗?

4.intersection - 算出两个数组的交集(公共部分)。可以实现时间复杂度为O(M+N)(M和N为两个数组的长度)的方法吗?

5.sort -实现 sort 方法,用于排序元素为数字的数组, 且时间复杂度为O(N×log(N))

6.includes - 判断给定的数字是否出现在给定的已排列好的数组中,返回truefalse。是否能设计出时间复杂度为O(log(N))的算法?

7.assignDeep- 仿照 Object.assign, 但是要深度合并对象。为了简单起见,可以假设对象只包含数字或是什么别的(而不是数组、函数等)。

8.reduceAsync- 仿照reduce 你在“简单”部分中完成了,但每个条目都必须在进行下一步之前被解决。

9.用reduceAsync来实现seqseq使用一个可返回 promise的函数体内使用数组的函数,然后逐一的解决。

原文地址:https://www.cnblogs.com/wanghao123/p/10304870.html