首页 > 解决方案 > 查找最接近给定 24 小时时间的时间

问题描述

给定函数签名:

getNearestToDesiredTime(left, middle, right, desiredTime)

在哪里:

您如何找到最接近所需时间的时间?

在时间参数都与所需时间等距的情况下,应返回较晚的时间。(在上面的示例中,1900应该返回,因为1900183015距所需的分钟数1845)。

这是我到目前为止所拥有的,但它似乎不太奏效。

const timeDiffInMinutes = (t1, t2) => {
  const t1Mins = t1 / 100 * 60 + t1 % 100;
  const t2Mins = t2 / 100 * 60 + t2 % 100;
  return t2Mins - t1Mins;
};

const getNearestToDesiredTime = (left, middle, right, desiredTime) => {
  if (middle !== -1) {
    return middle;
  } else if (left === -1 && right === -1) {
    return null;
  }

  // result should be whatever time is _closest_ to the desiredTime.
  // if both options are equi-distant to the desired time, show the later time.
  const leftIsCloser =
    timeDiffInMinutes(desiredTime, left) <
    timeDiffInMinutes(desiredTime, right);

  return leftIsCloser ? left : right;
};

测试用例:

// this should be 1900
console.log(getNearestToDesiredTime(1830, 1900, 1945, 1900))

// this should be 1915
console.log(getNearestToDesiredTime(1830, 1915, 1945, 1900))

// this should be 1830
console.log(getNearestToDesiredTime(1830, -1, 1945, 1845))

// this should be 1945
console.log(getNearestToDesiredTime(1830, -1, 1945, 1930))

// this should be 1900
console.log(getNearestToDesiredTime(1830, -1, 1900, 1845))

标签: javascripttime

解决方案


稍微改变它以处理更通用的时间数组。我们跟踪最佳差异,然后返回造成差异的时间

// this should be 1900
console.log(getNearestToDesiredTime([1830, 1900, 1945], 1900))

// this should be 1915
console.log(getNearestToDesiredTime([1830, 1915, 1945], 1900))

// this should be 1830
console.log(getNearestToDesiredTime([1830, 1945], 1845))

// this should be 1945
console.log(getNearestToDesiredTime([1830, 1945], 1930))

// this should be 1900
console.log(getNearestToDesiredTime([1830, 1900], 1845))

function timeDiffInMinutes (t1, t2) {
  const t1Mins = Math.floor(t1 / 100) * 60 + t1 % 100;
  const t2Mins = Math.floor(t2 / 100) * 60 + t2 % 100;
  return t2Mins - t1Mins;
};


function getNearestToDesiredTime (times, target) {
  var best = Infinity;
  var bestIndex = -1;
  
  for (var i = 0; i < times.length; i++) {
      var difference = Math.abs(timeDiffInMinutes(times[i], target));
      if (difference <= best) {
          best = difference;
          bestIndex = i;
      }
  }
  return times[bestIndex];
}


推荐阅读