1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
给你两个字符串 startTime 和 finishTime ,均符合 "HH:MM" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。
例如,如果 startTime = "05:20" 且 finishTime = "05:59" ,这意味着你仅仅完成从 05:30 到 05:45 这一个完整对局。而你没有完成从 05:15 到 05:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:45 到 06:00 的完整对局,因为你是在对局结束前退出的游戏。
如果 finishTime 早于 startTime ,这表示你玩了个通宵(也就是从 startTime 到午夜,再从午夜到 finishTime)。
假设你是从 startTime 进入游戏,并在 finishTime 退出游戏,请计算并返回你完成的 完整对局的对局数 。
示例 1:
输入:startTime = "12:01", finishTime = "12:44"
输出:1
解释:你完成了从 12:15 到 12:30 的一个完整对局。
你没有完成从 12:00 到 12:15 的完整对局,因为你是在对局开始后的 12:01 进入的游戏。
你没有完成从 12:30 到 12:45 的完整对局,因为你是在对局结束前的 12:44 退出的游戏。
示例 2:
输入:startTime = "20:00", finishTime = "06:00"
输出:40
解释:你完成了从 20:00 到 00:00 的 16 个完整的对局,以及从 00:00 到 06:00 的 24 个完整的对局。
16 + 24 = 40
示例 3:
输入:startTime = "00:00", finishTime = "23:59"
输出:95
解释:除最后一个小时你只完成了 3 个完整对局外,其余每个小时均完成了 4 场完整对局。
提示:
startTime 和 finishTime 的格式为 HH:MM
00 <= HH <= 23
00 <= MM <= 59
startTime 和 finishTime 不相等
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/the-number-of-full-rounds-you-have-played
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先要判断开始时间是否比结束时间大,如果大,说明过了一天。
if loginTime > logoutTime {
//隔天
} else {
//当天
}
隔天的可以认为是 start到24:00 + 0:00 到end。
那么我们就可以只关心当天的计算了。
一个整点是 4次。
endHour - startHour - 1 为间隔的整点。这里注意下如果开始时间和结束时间都是 0分的时候 需要加1。
然后就是以分钟算的次数。
如果开始时间和结束时间不是同一个小时, 那么就是 60 - startMin 看看有多少个15,即为次数,end - 0 看看有多少个15,即为次数。
如果是在同一个小时,那么判断开始时间是0 还是15以下还是... 然后以整数时间作为开始时间算次数。
代码如下
func numberOfRounds(_ loginTime: String, _ logoutTime: String) -> Int {
var round = 0
let startArr = loginTime.components(separatedBy: ":")
let startHour = Int(startArr[0])!
let startMin = Int(startArr[1])!
let endArr = logoutTime.components(separatedBy: ":")
let endHour = Int(endArr[0])!
let endMin = Int(endArr[1])!
if loginTime > logoutTime {
// 过了一天
round = round + rounds(startHour: startHour, endHour: 24, startMin: startMin, endMin: 0)
round = round + rounds(startHour: 0, endHour: endHour, startMin: 0, endMin: endMin)
} else {
// 当天
round = round + rounds(startHour: startHour, endHour: endHour, startMin: startMin, endMin: endMin)
}
return round
}
func rounds(startHour: Int, endHour: Int, startMin: Int, endMin: Int) -> Int {
var rounds = 0
let wholeHour = max(endHour - startHour - 1, 0)
rounds = wholeHour * 4
if endHour != startHour {
if startMin == 0 && endMin == 0 {
rounds += 4
} else {
rounds += (60 - startMin) / 15
rounds += (endMin - 0) / 15
}
} else {
if startMin == 0 {
rounds += max((endMin - 0) / 15, 0)
} else if startMin <= 15 {
rounds += max((endMin - 15) / 15, 0)
} else if startMin <= 30 {
rounds += max((endMin - 30) / 15, 0)
} else if startMin <= 45 {
rounds += max((endMin - 45) / 15, 0)
}
}
return rounds
}
附结果
![](https://img-blog.csdnimg.cn/img_convert/12f2ebfdbc0db1b6c3be0ede128a56d4.png)
总结归纳一下,一行代码也能搞定。
当不是一天的时候 endHour += 24
小时次数就是 (endHour - startHour - 1)*4。
开始时间算是 (60 - startMin) / 15
结束计算时间是 end / 15
那么代码为
func numberOfRounds(_ loginTime: String, _ logoutTime: String) -> Int {
var round = 0
let startArr = loginTime.components(separatedBy: ":")
let startHour = Int(startArr[0])!
let startMin = Int(startArr[1])!
let endArr = logoutTime.components(separatedBy: ":")
var endHour = Int(endArr[0])!
let endMin = Int(endArr[1])!
if loginTime > logoutTime {
endHour += 24
}
round = (endHour - startHour - 1) * 4 + (60 - startMin) / 15 + endMin / 15
return max(round, 0)
}
附结果
![](https://img-blog.csdnimg.cn/img_convert/ea0e259fcad5fc3dc0aa52b2f8043530.png)