zoukankan      html  css  js  c++  java
  • 做题做题 五道一发 第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
  • 相关阅读:
    Resource和Autowired区别
    mybatisplus 分页查询+ dao层抽象
    Error attempting to get column from result set
    第一模块经济学核心原理,第一模块经济学核心原理
    springboot 优雅的启动类
    maven把依赖打进jar包
    第一章:第1课 经济学世界观(上)
    AutomicBoolean
    java异步转同步
    接口作为方法的返回值
  • 原文地址:https://www.cnblogs.com/ccforeverd/p/4326834.html
Copyright © 2011-2022 走看看