一、编码(初级)
1.isPrime
- 返回true
或false
, 表示输入的数是否为质数
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
- 返回true
或false
,表示给定的数组是否被排序过
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
- 用true
或false
表示给定的字符串的花括号是否平衡(一一对应)
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
- 判断给定的数字是否出现在给定的已排列好的数组中,返回true
或false
。是否能设计出时间复杂度为O(log(N))的算法?
7.assignDeep
- 仿照 Object.assign, 但是要深度合并对象。为了简单起见,可以假设对象只包含数字或是什么别的(而不是数组、函数等)。
8.reduceAsync
- 仿照reduce 你在“简单”部分中完成了,但每个条目都必须在进行下一步之前被解决。
9.用reduceAsync
来实现seq
。seq
使用一个可返回 promise
的函数体内使用数组的函数,然后逐一的解决。