手写算法: 你完成的完整对局数
思路
理解题意:15 分钟为一场,每 15 分钟为一个起点,那么一个小时有 4 个完整的对局,差一分钟也不可,完整的对局需要从
00,15,30,45开始。 结束时间有可能比开始时间小,那么代表玩了通宵,需要加 24 小时 (即 60 * 24)将单位统一转换成分钟再进行比较
[t0, t1]计算[t0, t1]区间内的完整对局个数,可以将 t1 转换成最后一场完整对局的结束时间_t1,即
_t1 = t1 - (t1 % 15)再计算与入局时间的差值,除以对局时间,向上取整
/**
* @param {string} loginTime
* @param {string} logoutTime
* @return {number}
*/
var numberOfRounds = function(loginTime, logoutTime) {
const start = toMinutes(loginTime);
let finish = toMinutes(logoutTime);
// 如果开始时间大于结束时间,则认为是通宵了,需要加上24个小时
if (start > finish) {
finish += 1440;
}
// 算差值:
// 1. 算最后一局的完整对局时间 finish - (finish % 15)
// 2. 减去入局时间
// 3. 除以周期,向上取整
const count = Math.floor((finish - (finish % 15) - start) / 15);
return Math.max(0, count);
};
// 转换成分钟
const toMinutes = time => {
const [h, m] = time.split(':');
return Number(h) * 60 + Number(m);
};
手写题: 实现 Array.prototype.map()
MDN -----> Array.prototype.map()
入参有两个, callback和 thisArg【可选】
- callback 生成新数组元素的函数,入参有
currentValue当前正在处理的元素,index【可选】当前元素的索引,array【可选】调用的数组 - thisArg 执行 callback 函数时,被用作 this
Array.prototype.myMap = function(callback, thisArg = null) {
if (typeof callback !== 'function') {
throw new TypeError(`expect got function, but got an ${typeof callback}`);
}
if (!Array.isArray(this)) {
throw new TypeError(`expect got function, but got an ${typeof this}`);
}
const arr = this,
len = arr.length;
let result = new Array(len);
for (let i = 0; i < len; i++) {
// 判断当前元素是否在arr中
if (i in arr) {
result[i] = callback.call(thisArg, arr[i], i, arr);
}
}
return result;
};