一天一道力扣题

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
    }

附结果

总结归纳一下,一行代码也能搞定。

当不是一天的时候  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)
    }

附结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值