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)
}
};