记录一些遇到不会的算法题

一.题目描述

实现 fizzBuzz 函数,参数 num 与返回值的关系如下:
1、如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
2、如果 num 能被 3 整除,返回字符串 fizz
3、如果 num 能被 5 整除,返回字符串 buzz
4、如果参数为空或者不是 Number 类型,返回 false
5、其余情况,返回参数 num
这道题很简单啊!
啪啪啪敲完。。。。。。。。。。。。。。。

function fizzBuzz(num) {
    if(isNaN(num)){
        return false;
    }
    var str="";

    if(num%3==0){
        return str+="fizz";
    }
     if(num%5==0){
        return str+="buzz";
    }
    return str?str:num;
}

结果:


记录一些遇到不会的算法题_第1张图片
mmexport1509967195592.jpg

看了好久还是觉得我的代码没有问题,甚至完美。。
可是没有百分百通过说明是有问题的,那就去谷歌测试下,发现第一种情况漏了????
我这不是字符串拼接么,回去一看,(⊙o⊙)…

第7行和第10行加了return!!

知道原因了,

位于return语句之后的任何代码都永远不会执行!

所以在满足条件之后直接返回字符串不会继续执行下面的代码,也就没有了第一种情况。

补充:num是null的情况

isNaN(null) //false ; !null //true

也就是说null 也是Number类型!!!可能我之前知道,但今天我确实已经忘了!!

下面是改正后的代码,通过了。。。。。

function fizzBuzz(num) {
    var str="";
    if(!num || isNaN(num)){
        return false;
    }
    if(num%3==0){
        str+="fizz";
    }
     if(num%5==0){
         str+="buzz";
    }
    return str?str:num;
}

二.将函数 fn 的执行上下文改为 obj 对象

在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。

function speak(fn, obj) {
    return fn.apply(obj,obj);
}

三.实现函数使输入 functionFunction('Hello')('world');输出:Hello, world

function functionFunction(str) {
    return function f(str2){
        return str+", "+str2;
    }
}

四.实现函数 callIt,调用之后满足如下条件

1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数

function callIt(fn) {
   var ary=Array.prototype.slice.call(arguments,1);
    var result=fn.apply(this,ary);
    return result;
}

arguments是类数组,因此要获得callIt的第一个参数之后的所有参数,不能直接使用slice方法截取,需要先将arguments转换为真正的数组才行。有两种常见的方法,一是使用slice方法:
var ary=Array.prototype.slice.call(arguments);二是循环遍历逐一填入新数组。在获得了ary之后,就可以调用apply来执行传入的函数参数了。

你可能感兴趣的:(记录一些遇到不会的算法题)