手写算法: 你完成的完整对局数

1904. 你完成的完整对局数open in new window

思路

  1. 理解题意:15 分钟为一场,每 15 分钟为一个起点,那么一个小时有 4 个完整的对局,差一分钟也不可,完整的对局需要从00,15,30,45开始。 结束时间有可能比开始时间小,那么代表玩了通宵,需要加 24 小时 (即 60 * 24)

  2. 将单位统一转换成分钟再进行比较 [t0, t1]

  3. 计算[t0, t1]区间内的完整对局个数,可以将 t1 转换成最后一场完整对局的结束时间_t1,即_t1 = t1 - (t1 % 15)

  4. 再计算与入局时间的差值,除以对局时间,向上取整

/**
 * @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()open in new window

入参有两个, callbackthisArg【可选】

  • 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;
};
Last Updated:
Contributors: kk