做题做题 五道一发 第1发
在群里围观到一份题, 看了看感觉很有意思, 记在博客里.
传送门: https://github.com/nunnly/everycode/issues
1. 字符串反序
题目:
/* * 在String对象的原型上创建一个方法,实现以下功能 * "String".reverse() // return "gnirtS" * "Super awesome string here" //return "ereh gnirts emosewa repuS" * **/ String.prototype.reverse = function() { // blablablabla... }; // 测试代码 "asdf".reverse() === "fdsa";
解答:
(1)最朴实的法子
String.prototype.reverse = function() { var str = ""; for (var i = this.length - 1; i >= 0; i--) { str += this[i]; }; return str; }; console.log("asdf".reverse() === "fdsa"); // true
(2)比朴实法子好一点的
String.prototype.reverse = function() { var arr = this.split(""); for (var i = 0; i < arr.length / 2; i++) { // 循环一半长度,调换前后位置 var temp = arr[arr.length - i - 1]; arr[arr.length - i - 1] = arr[i]; arr[i] = temp; }; return arr.join(""); }; console.log("asdf".reverse() === "fdsa"); // true
(3)最高大上的法子
String.prototype.reverse = function() { return Array.prototype.reverse.call(this.split("")).join(""); // 这里不能直接传入字符串,需要先转换成数组 }; console.log("asdf".reverse() === "fdsa"); // true
(4)最简短的法子
String.prototype.reverse = function() { return this.split("").reverse().join(""); }; console.log("asdf".reverse() === "fdsa"); // true
2. 重写数组reverse方法
题目:
// 由于不明原因,Array的reverse方法消失在二次元空间了,Program ape, help me please. Array.prototype.reverse = function() { //代码实现写在这里,最后应该默认return this };
解答:
(1)最朴实的法子
Array.prototype.reverse = function() { var i = 0, len = this.length; for (var i = 0; i < len / 2; i++) { var temp = this[i]; this[i] = this[len - 1 - i]; this[len - 1 - i] = temp; }; return this; }; console.log([1,2,3,4].reverse()); // [4,3,2,1]
(2)一个有歧义的法子, 方法很亮, 虽然返回的不是原来的数组
Array.prototype.reverse = function() { return this.reduce(function(arr, item) { // reduce对每一项的值进行操作,返回最后的结果.arr表示传入的[]数组,item表示值 arr.unshift(item); return arr; }, []); }; console.log([1,2,3,4].reverse()); // [4,3,2,1]
或
Array.prototype.reverse = function() { return this.reduceRight(function(arr, item) { // 和reduce一样,只不过从最后一项开始,所以这里用push arr.push(item); return arr; }, []); }; console.log([1,2,3,4].reverse()); // [4,3,2,1]
3. 斐波那契数列
题目:
/* 根据传入的数值,返回一个等长的,斐波那契数列的数组。 * 如果参数为负数,那么返回空数组 */ function fibonacci(num){ } // 测试如下 fibonacci(4); // should return [0,1,1,2] fibonacci(-1); // should return []
解答:
(1)最朴实的法子
function fibonacci(num) { var arr = []; if (num < 0) { return arr }; arr = [0, 1]; if (num < arr.length) { return arr.slice(0, num) }; for (var i = arr.length; i < num; i++) { arr[i] = arr[i - 2] + arr[i - 1]; }; return arr; } console.log(fibonacci(-1)); // [] console.log(fibonacci(0)); // [] console.log(fibonacci(1)); // [0] console.log(fibonacci(2)); // [0, 1] console.log(fibonacci(3)); // [0, 1, 1] console.log(fibonacci(4)); // [0, 1, 1, 2] console.log(fibonacci(9)); // [0, 1, 1, 2, 3, 5, 8, 13, 21]
(2)加入迭代的法子一
function fibonacci(num) { num = +num; if (num === 1) { return [0]; } if (num === 2) { return [0, 1]; } if (num > 2) { var arr = fibonacci(num - 1); arr[num - 1] = arr[num - 2] + arr[num - 3]; return arr; } return []; } console.log(fibonacci(-1)); // [] console.log(fibonacci(0)); // [] console.log(fibonacci(1)); // [0] console.log(fibonacci(2)); // [0, 1] console.log(fibonacci(3)); // [0, 1, 1] console.log(fibonacci(4)); // [0, 1, 1, 2] console.log(fibonacci(9)); // [0, 1, 1, 2, 3, 5, 8, 13, 21]
(3)加入迭代的法子二
function fibonacci(num) { var fibArray = []; var fibNum = function(i) { if (i == 0) { return 0; } if (i == 1) { return 1; } return arguments.callee(i - 1) + arguments.callee(i - 2); //递归调用fibNum函数 }; for (var i = 0; i < num; i++) { fibArray[fibArray.length] = fibNum(i); } return fibArray; } console.log(fibonacci(-1)); // [] console.log(fibonacci(0)); // [] console.log(fibonacci(1)); // [0] console.log(fibonacci(2)); // [0, 1] console.log(fibonacci(3)); // [0, 1, 1] console.log(fibonacci(4)); // [0, 1, 1, 2] console.log(fibonacci(9)); // [0, 1, 1, 2, 3, 5, 8, 13, 21]
(4)围观下楼主给出的法子 --- 比我写的好看的多= =
function fibonacci(num) { //Math.sign 识别变量的符号,如果是正数返回1,负数返回-1,0返回0,非数字返回NaN if (Math.sign(num) != 1) { return []; } else if (num == 1) { return [0] } else if (num == 2) { return [0, 1] } else { var arr = [0, 1] for (var i = 2; i < num; i++) { arr[i] = arr[i - 2] + arr[i - 1]; } return arr; } } console.log(fibonacci(-1)); // [] console.log(fibonacci(0)); // [] console.log(fibonacci(1)); // [0] console.log(fibonacci(2)); // [0, 1] console.log(fibonacci(3)); // [0, 1, 1] console.log(fibonacci(4)); // [0, 1, 1, 2] console.log(fibonacci(9)); // [0, 1, 1, 2, 3, 5, 8, 13, 21]
4. 判断是否为素数
题目:
创建一个函数isPrime
判断传入的参数是否为素数(质数),返回true
或 false
。
function isPrime(number){ } //请做以下测试 isPrime(0) // => false isPrime(1) // => false isPrime(2) // => true isPrime(4) // => false isPrime(157) //=> true
解答:
蒙B了, 没好好动脑子, 围观下别人的解法
(1)楼主解法
function isPrime(number) { if (number <= 2){ return false; } for(var i = 2; i <= parseInt(number / 2); i++) { if (number % i === 0) { return false; } } return true; }
(2)数学解法, 不明觉厉
function isPrime(n) { if (n<4) { return true; } for(var i= 2; i <= Math.sqrt(n); i++) { // 比直接/2要好些 if (n % i== 0) { return false; } } return true; }
function isPrime( n ) { var sqrt_n = Math.sqrt( n ); var sqrt_n_half = sqrt_n >> 1; if( n===1 || n % 2 === 0 ) { return false; } for(var i = 1; i <= sqrt_n_half; i++ ) { if( n % ((i << 1) + 1) === 0) return false; } return true; } console.log(isPrime(157)); // true
(3)不一样的写法
function isPrime(number) { return new Array(Math.floor(Math.sqrt(number))).join("|").split("").reduce(function(idx) { return (idx < 0) ? idx : (number % idx ? idx + 1 : -1); }, 2) >= 0; } for(var i = 1; i < 20; i++) { console.log(isPrime(i)); } console.log(isPrime(157));
function isPrime(number) { return isNaN(number)? (number.numa <== 1? false: (number.numb === 1? true: (number.numa % number.numb === 0? false: isPrime({"numb":number.numb - 1,"numa":number.numa})))): isPrime({"numa":number,"numb":number - 1}); }
function isPrime(number) { if(number < 2) return !1; for(var i = Math.sqrt(number) | 0; i > 1; i--) { if(!(number % i)) return !1; } return !0; }
(4)正则写法, 绝对牛
function isPrime(number){ return !/^1?$|^(11+?)\1+$/.test(new Array(number + 1).join('1')); }
5. 对象(json)路径
现在你有一个复杂的多重嵌套的对象,但是你莫名蛋疼,突然就不想用if obj.property == null
这个方法。于是乎打算,在Object
的原型上创建一个方法(prototype method
),传递一个路径,返回undefined
或 值(value
);
Object.prototype.hash = function(path){ } var obj = { person: { name: 'joe', history: { hometown: 'bratislava', bio: { funFact: 'I like fishing.' } } } }; obj.hash('person.name'); // 'joe' obj.hash('person.history.bio'); // { funFact: 'I like fishing.' } obj.hash('person.history.homeStreet'); // undefined obj.hash('person.animal.pet.needNoseAntEater'); // undefined