这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战
题目
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例
输入: timePoints = ["23:59","00:00"]
输出: 1
输入: timePoints = ["00:00","23:59","00:00"]
输出: 0
提示
2 <= timePoints.length <= 2 * 10
timePoints[i]
格式为 "HH:MM"
解题思路
题目中给出的是小时+分钟格式的字符串,我们要计算最小时间差的话,还需要将其转换成数值类型才能进行比较。
- 只有小时+分钟,那么我们可以将其拆分成两部分,然后将 小时 * 60 得出对应的分钟数,再加上后面分钟部分即可得到最终数值。
- 一天
24
小时,换算成分钟的话只有1440
分钟,如果timePoints
的长度超过1440
的话,我们就可以直接返回0
,因为此时必定有重复的时间,其差距为0。 - 先将时间点进行排序,再遍历时间点,计算两个时间点直接的时间差。
23:00 - 00:00
的情况需要单独做处理。
代码实现
class Solution {
public int findMinDifference(List<String> timePoints) {
// 边界判断,超过1440个时间点的,直接返回0
if(timePoints.size() > 1440){
return 0;
}
// 按照时间大小进行排序,方便后面时间差的比较
Collections.sort(timePoints);
// 初始值
int pre = getTime(timePoints.get(0).split(":")), min = 1440;
// 遍历后续时间点
for(int i = 1; i < timePoints.size(); ++i){
// 计算总分钟数
int time = getTime(timePoints.get(i).split(":"));
// 更新最小时间差
min = Math.min(min, time - pre);
// 更新前一时间点
pre = time;
}
// 将最后一个时间点与第一个时间点做比较,例如23:00 - 00:00,之间点时间差为1
min = Math.min(min, getTime(timePoints.get(0).split(":")) + 1440 - pre);
// 返回结果
return min;
}
private int getTime(String[] time){
// 小时 * 60 + 分钟
return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
}
}