我正在做一个编码挑战,目标是在字符串列表中找到最小的时差。我放弃了,并寻找了一个完全有意义的解决方案,但我对方法parseTime
感到困惑。任何人都可以解释一下这种方法吗?
在我看来,比较的两个小时被减去,然后乘以 60(因为一小时 60 分钟? 从那比较分钟,然后我迷路了..谁能解释得尽可能简单?
public static void main(String[] args) {
String[] strings = {"10:00am", "11:45pm", "5:00am", "12:01am"};
int i = TimeDifference(strings);
System.out.println(i);
}
public static int TimeDifference(String[] strArr) {
int min = Integer.MAX_VALUE;
for (int i=0; i<strArr.length; i++) {
for (int j=0; j<strArr.length; j++) {
if (i != j) {
int time = parseTime(strArr[j], strArr[i]);
if (time < min) min = time;
}
}
}
return min;
}
private static int parseTime(String time1, String time2) {
int time = (parseHour(time2) - parseHour(time1))*60;
time += parseMin(time2) - parseMin(time1);
if (isMorning(time2) != isMorning(time1)) {
time += 12 *60;
} else if (time <= 0 ) {
time += 24 * 60;
}
return time;
}
private static int parseHour(String time) {
int hour = Integer.valueOf(time.split(":")[0]);
return ( hour == 12? 0: hour);
}
private static int parseMin(String time) {
return Integer.valueOf(time.split(":")[1].replaceAll("[^0-9]",""));
}
private static boolean isMorning(String time) {
String post = time.split(":")[1].replaceAll("[^a-z]","");
return post.toLowerCase().equals("am");
}
尝试在脑海中调试代码。请在下面查看我的评论:
int minutes = parseTime("10:00am", "11:45pm");
private static int parseTime(String time1, String time2) {
int minutes = (parseHour(time2) - parseHour(time1))*60;//(11 - 10) * 60 = 60 minutes
minutes += parseMin(time2) - parseMin(time1); //60 + 45 - 0 = 105 minutes
if (isMorning(time2) != isMorning(time1)) { // 10:00am is not morning but 11:45pm is morning
minutes += 12 *60; //so we have to add 12 hours(12 * 60 minutes)
} else if (minutes <= 0 ) {
minutes += 24 * 60;
}
return minutes;
}
这是关于正则表达式(RegEx)的。我们以11:45pm
为例,分手parseTime
:
int time = (parseHour(time2) - parseHour(time1))*60;
第一行使用parseHour
,它利用split
将字符串拆分为给定正则表达式的匹配项,":"
,然后将索引 0 处的字符串解析为整数。 字符串"11:45pm"
被拆分为字符串数组{"11", "45pm"}
,并返回整数11
。
time += parseMin(time2) - parseMin(time1);
第二行使用parseMin
,它同样拆分给定的字符串,但解析索引 1 处的字符串。但是,字符串"45pm"
不能解析为整数,因为它包含非数字"pm"
,因此我们使用replaceAll
将任何非数字替换为空字符串。replaceAll
将匹配给定正则表达式的此字符串的每个子字符串替换为给定替换。"[^0-9]"
匹配0-9
中不存在的任何单个字符,这些字符都是非数字,因此"45pm".replaceAll("[^0-9]", "")
返回"45"
,然后被解析为整数。
其余的已经由其他人回答了。
是的,小时差乘以60
转换为分钟。然后使用parseMin
将分钟差添加到其中。
现在我们需要它 检查它是AM
还是PM
.示例:如果时间是10:30 am
和1:35 pm
。实际时差为+115
分钟。
parseHour
后,time
的值将为-600
((1-10)*60。然后在parseMin
之后,time
将被-595
(增加5分钟的差)。现在我们需要看看它是AM
还是PM
.由于time1
是AM
而time2
是PM
的,我们添加12hrs
的差异。这是因为AM
和PM
的相同时间相差 12 小时。 在此之后,time
将是(-605 + 720) = 115
分钟。
当time<=0
.这是time2
在time1
之前的时候。示例time1
10:35am
,time2
10:30am
。所以问题是 -从10:35am
到达10:30am
需要多少时间.由于它是10:35am
,而且我们无法及时返回,我们需要等到第二天(24小时)才能到达10:30am
。所以我们在time
中添加24*60 minutes
,这将得到-5 + (24*60)