题目内容
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = [“23:59”,“00:00”]
输出:1
示例 2:
输入:timePoints = [“00:00”,“23:59”,“00:00”]
输出:0
提示:
2 <= timePoints <= 2 * 104
timePoints[i] 格式为 "HH:MM"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-difference
c语言解答(哈希表)
int findMinDifference(char ** timePoints, int timePointsSize){
//数量超过总共最大的数了,肯定重复,最多存在1440个不同的时间
if(timePointsSize>=1440){
return 0;
}
//空间申请和初始化
int* hash = (int*)malloc(sizeof(int) * 1440);
memset(hash, 0, sizeof(int) * 1440);
// int hash[1440]={0};
int hour, minu;
int max=0,min=1439;
for (int i = 0; i < timePointsSize; ++i) {
//将字符串转换成整数
sscanf(timePoints[i], "%d:%d", &hour, &minu);
int temp=hour*60 + minu;
//找最小值
if(temp>max){
max=temp;
}
//找最大值
if(temp<min){
min=temp;
}
//如果有时间重复,直接返回0
if(hash[temp]==1){
return 0;
}
hash[temp]=1;
}
//直接把特殊情况当做cha,23::59 和 00::00差为1
int cha=min+1440-max;
int bian=min;
//从最小值到最大值遍历,求最小差
for(int i=min+1;i<=max;i++){
if(hash[i]==1){
if(i-bian<cha){
//更新最小差
cha=i-bian;
}
//用bian保留下一个元素需要减的数
bian=i;
}
}
return cha;
}
java语言解答
class Solution {
public int findMinDifference(List<String> timePoints) {
//数量超过总共最大的数了,肯定重复,最多存在1440个不同的时间
if(timePoints.size()>=1440){
return 0;
}
//数组声明和初始化
int [] hash=new int [1440];
for(int i=0;i<1440;i++){
hash[i]=0;
}
int hour, minu;
int max=0,min=1439;
for (int i = 0; i < timePoints.size(); i++) {
//将字符串转换成整数
int temp=minute(timePoints.get(i));
//找最小值
if(temp>max){
max=temp;
}
//找最大值
if(temp<min){
min=temp;
}
//如果有时间重复,直接返回0
if(hash[temp]==1){
return 0;
}
hash[temp]=1;
}
//直接把特殊情况当做cha,23::59 和 00::00差为1
int cha=min+1440-max;
int bian=min;
//从最小值到最大值遍历,求最小差
for(int i=min+1;i<=max;i++){
if(hash[i]==1){
if(i-bian<cha){
//更新最小差
cha=i-bian;
}
//用bian保留下一个元素需要减的数
bian=i;
}
}
return cha;
}
public int minute(String s) {
return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5));
}
}
leetcode题解中圈友将时间字符串转化的分钟的三种方法 : 链接地址
慢
public int minute(String s) {
String[] strs = s.split(":");
return Integer.parseInt(strs[0]) * 60 + Integer.parseInt(strs[1]);
}
中
public int minute(String s) {
return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5));
}
快,结果并不是真正的时间,但是差不变。(两数加上相等数,差值不变)
public int minute(String s) {
return s.charAt(0) * 600 + s.charAt(1) * 60 + s.charAt(3) * 10 + s.charAt(4);
}
作者:zyxwmj
链接:https://leetcode-cn.com/problems/minimum-time-difference/solution/pai-xu-1-ms10000-by-zyxwmj-zkaz/
来源:力扣(LeetCode)
总结:
数组更新和初始化,原本指导但是从来不用,现在开始用了
int* hash = (int*)malloc(sizeof(int) * 1440);
memset(hash, 0, sizeof(int) * 1440);
将字符串转换成整数 类似当时python学习的正则表达式,提取出来指定内容存起来
sscanf(timePoints[i], "%d:%d", &hour, &minu);
自己提交成功后,然后再看看大家的题解,也能从中学到不少.