一、题目描述
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
输入:timePoints = [“23:59”,“00:00”]
输出:1
二、代码思路
将 timePoints 排序后,最小时间差必然出现在timePoints 的两个相邻时间,或者 timePoints 的两个首尾时间中。因此排序后遍历一遍 timePoints 即可得到最小时间差。
- 使用collection对list集合进行排序
- 计算相邻之间的分钟之差(转换成分钟然后计算差)
- 最后计算首尾分钟之差
- 取最小
三、代码题解
package leetcode;
import java.util.*;
/*
* @author lzy
* @version 1.0
* */
public class findMinDif_ {
public static void main(String[] args) {
findMinDif_ findMinDif1 = new findMinDif_();
//findMinDif1.timeDifference("23:00", "00:00");
List<String> list = new ArrayList<>();
list.add("23:59");
list.add("00.00");
System.out.println(findMinDif1.findMinDifference(list));
}
public int timeDifference(String str1, String str2, int flag) {
if (flag == 1) {
//计算分钟
int mins1 = Integer.parseInt(str1.substring(3));
int mins2 = Integer.parseInt(str2.substring(3));
int hour1 = Integer.parseInt(str1.substring(0, 2));
int hour2 = Integer.parseInt(str2.substring(0, 2));
int minDiff = hour1 * 60 + mins1 - hour2 * 60 - mins2;
return minDiff;
//整形 + char 会自动转成整形
//System.out.println(mins1 + " " + mins2);
//计算小时
} else {
return ((str1.charAt(0) - '0') * 10 + (str1.charAt(1) - '0')) * 60 + (str1.charAt(3) - '0') * 10 +
(str1.charAt(4) - '0') + 1440 -
((str2.charAt(0) - '0') * 10 + (str2.charAt(1) - '0')) * 60 - (str2.charAt(3) - '0') * 10 -
(str2.charAt(4) - '0');
}
}
public int findMinDifference(List<String> timePoints) {
//初步想法:
//1、嵌套for循环依次计算两者时间差
//2、编写一个计算时间差的函数
Collections.sort(timePoints);
int point = 1;
int minMin = 1440;
int time;
while (point < timePoints.size()) {
minMin = ((time = timeDifference(timePoints.get(point), timePoints.get(point - 1),1)) > minMin) ? minMin : time;
if (minMin == 0) return 0;
point++;
}
return minMin > (time = timeDifference(timePoints.get(0),timePoints.get(timePoints.size() - 1),0)) ? time : minMin;
}
}