做题做题 五道一发 第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 []

先科普下斐波那契数列: http://baike.baidu.com/link?url=ilEIDjIUG-cYhsvbfUlomoPBRA8wIXpo6yW5Wz6wnkyPJnQBF3xaEXt6F1oOXZAqhFA6X4lyKkvXFv6AfhYPOa

解答:

(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

 

posted @ 2015-03-11 18:57  ccforeverd  阅读(253)  评论(0编辑  收藏  举报