获得最小的时差

时间:2016-02-21 04:27:44

标签: java

我最近在编码面试中被问到这个问题。我用HH:MM格式给了我一系列的时间。我需要找到最小的时差,以分钟为单位。时间本质上是循环的,因此23:55和00:12应该有17的差异。函数也需要处理00:00与24:00相同(这是最简单的部分,当然)。 有人可以帮助我解决问题。

4 个答案:

答案 0 :(得分:5)

首先将所有时间转换为分钟(HH * 60 + MM)。然后对该数字列表进行排序。现在,您可以浏览该列表并从下一个列表中减去每个时间。在该循环结束时,您必须从第一个+ 1440中减去最后一个。

答案 1 :(得分:0)

首先将时间转换为分钟。减去较大的时间和较小的时间以获得第一个差异。然后将24小时即1440分钟添加到较小的时间并再次减去时间。正确的答案是哪个差异较小。两个区别是前向和后向差异所需。

答案 2 :(得分:0)

你可以试试像贝洛:

import java.util.Arrays;
public class Main {
    public static void main(String args[]) {
        String times[] = {"2:30","00:00", "00:12", "24:00", "23:55"};/*input times*/
        int countTime = times.length;
        int sortedTimes[] = new int[countTime];/*will hold sorted times*/

        for (int i = 0; i < countTime; i++) {/*convert 'HH:mm' to integer minute*/
            int t = Integer.valueOf(times[i].split(":")[0])*60 
                    + Integer.valueOf(times[i].split(":")[1]);
            sortedTimes[i] = t;
        }
        Arrays.sort(sortedTimes);/*sort times*/         
        /*variables to hold the result*/
        int minDiff = 1440;
        int minT1 = 1440;
        int minT2 = 1440;

        for (int i = 0; i < countTime; i++) {
            int curr = sortedTimes[i];
            int prev = sortedTimes[(countTime+i-1)%countTime];
            int diffPrev = Math.abs(curr - prev) < 1440 - Math.abs(curr - prev ) ? 
                    Math.abs(curr - prev) :  1440 - Math.abs(curr - prev  ) ; 
            if (minDiff > diffPrev) {
                    minDiff = diffPrev;
                    minT1 = prev;
                    minT2 = curr;                   
            }
        }       
        System.out.println("Minimum diff in minute: " + minDiff 
                + " between " + (minT1/60 + ":" + minT1%60) 
                + " and " + (minT2/60 + ":" + minT2%60));

    }
}

答案 3 :(得分:0)

此处的Javascript解决方案:

var findMinDifference = function(timePoints) {
  let min = Infinity;

  let data = timePoints.map(d => timeToMin(d));

  //sorting data
  let sortedData = data.sort((a, b) => a - b);

  for (let i = 1; i < sortedData.length; i++) {
    min = Math.min(min, sortedData[i] - sortedData[i - 1]);
  }

  //subtract the last from the first 1440.
  let firstLastDiff =
    60 * 24 - (sortedData[sortedData.length - 1] - sortedData[0]);

 
  min = Math.min(firstLastDiff, min);

  return min;
};

// convert all times into minutes (HH * 60 + MM)
function timeToMin(t) {
  const [hours, min] = t.split(":").map(d => parseInt(d));
  return hours * 60 + min;
}