JavaScript篇

1、2618. 检查是否是类的对象实例

描述:

请你编写一个函数,检查给定的值是否是给定类或超类的实例。

可以传递给函数的数据类型没有限制。例如,值或类可能是  undefined 。

way1:非递归

var checkIfInstanceOf = function(obj, classFunction) {
  if (classFunction === null || classFunction === undefined) {
    return false;
  }
  while(obj !== null && obj !== undefined) {
    if (obj === classFunction.prototype) {
      return true;
    };
    obj = obj.__proto__;
    // 用api的写法
    // obj = Object.getPrototypeOf(obj);  
  }
  return false;
};

way2:递归

var checkIfInstanceOf = function(obj, classFunction) {
  if (classFunction === null || classFunction === undefined ||
  obj === null || obj == undefined) {
    return false;
  };
  return obj.__proto__ === classFunction.prototype ||
 checkIfInstanceOf(obj.__proto__, classFunction);
};

2、2619. 数组原型对象的最后一个元素

描述:请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素。如果数组中没有元素,则返回 -1 。

Array.prototype.last = function() {
    // this指向实例
    return this.length ? this[this.length-1] : -1;

    // 使用合并操作符:??,当左边是null或者undefined时,返回右边边
    // 防止左边是0时,也返回右边
    return this[this.length - 1] ?? -1
};

3、2620. 计数器

描述:请你编写并返回一个 计数器 函数,它接收一个整型参数 n 。这个 计数器 函数最初返回 n,每次调用它时返回前一个值加 1 的值 ( n ,  n + 1 ,  n + 2 ,等等)。

考点:闭包

var createCounter = function(n) {
    return function() {
        return n++;
    };
};

4、2621. 睡眠函数

描述:请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠这么多毫秒。要求此函数可以解析任何值。

async function sleep(millis) {
    return new Promise((resolve)=> setTimeout(resolve, millis));
}

5、2622. 有时间限制的缓存

描述:

编写一个类,它允许获取和设置键-值对,并且每个键都有一个 过期时间 。

该类有三个公共方法:

  • set(key, value, duration) :接收参数为整型键 key 、整型值 value 和以毫秒为单位的持续时间 duration 。一旦 duration 到期后,这个键就无法访问。如果相同的未过期键已经存在,该方法将返回 true ,否则返回 false 。如果该键已经存在,则它的值和持续时间都应该被覆盖。
  • get(key) :如果存在一个未过期的键,它应该返回这个键相关的值。否则返回 -1 。
  • count() :返回未过期键的总数。

思路:计时器


var TimeLimitedCache = function() {
    this.hashMap={}
};

/** 
 * @param {number} key
 * @param {number} value
 * @param {number} time until expiration in ms
 * @return {boolean} if un-expired key already existed
 */
TimeLimitedCache.prototype.set = function(key, value, duration) {
    let timer;
    let result=false
    if(this.hashMap[key]){
        clearTimeout(this.hashMap[key][1]);
        result=true;
    }
    timer=setTimeout(()=>{
        delete this.hashMap[key];
    },duration)
    this.hashMap[key]=[value,timer];
    return result;

};

/** 
 * @param {number} key
 * @return {number} value associated with key
 */
TimeLimitedCache.prototype.get = function(key) {
    return this.hashMap[key]?this.hashMap[key][0]:-1;
    
};

/** 
 * @return {number} count of non-expired keys
 */
TimeLimitedCache.prototype.count = function() {
    return Object.keys(this.hashMap).length;
};

/**
 * Your TimeLimitedCache object will be instantiated and called as such:
 * var obj = new TimeLimitedCache()
 * obj.set(1, 42, 1000); // false
 * obj.get(1) // 42
 * obj.count() // 1
 */

6、2623. 记忆函数

描述:

请你编写一个函数,它接收另一个函数作为输入,并返回该函数的 记忆化后的结果。

记忆函数 是一个对于相同的输入永远不会被调用两次的函数。相反,它将返回一个缓存值。

你可以假设有 3 个可能的输入函数:sum 、fib 和 factorial 。

  •  sum 接收两个整型参数 a 和 b ,并返回 a + b 。
  •  fib 接收一个整型参数 n ,如果 n <= 1 则返回 1,否则返回 fib (n - 1) + fib (n - 2)
  •  factorial 接收一个整型参数 n ,如果 n <= 1 则返回  1 ,否则返回 factorial(n - 1) * n 。

思路:

  • 使用map记录曾经输入过的入参以及入参对应的结果。
  • 后续相同入参能够在map中找到并直接返回结果,不需要再次调用fn,达到记忆的效果。
function memoize(fn) {
    let m = new Map();
    return function (...args) {
        let key = Array.from(args).join(' ');
        if (!m.has(key)){
            m.set(key, fn(...args));
            };
        return m.get(key);
    }
}

7、2626. 数组归约运算

var reduce = function(nums, fn, init) {
    for (let i=0; i<nums.length; i++) {
        init = fn(init, nums[i]);
    };
    return init;
};

8、2629. 复合函数

var compose = function(functions) {
    return function (x) {
        return functions.reduceRight((target, fn) => fn(target), x)
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值