返回介绍

solution / 1900-1999 / 1904.The Number of Full Rounds You Have Played / README

发布于 2024-06-17 01:03:12 字数 4635 浏览 0 评论 0 收藏 0

1904. 你完成的完整对局数

English Version

题目描述

一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00HH:15HH:30HH:45 ,将会开始一个新的对局,其中 HH 用一个从 0023 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59

给你两个字符串 startTimefinishTime ,均符合 "HH:MM" 格式,分别表示你 进入退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数

  • 例如,如果 startTime = "05:20"finishTime = "05:59" ,这意味着你仅仅完成从 05:3005:45 这一个完整对局。而你没有完成从 05:1505:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:4506: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 场完整对局。

 

提示:

  • startTimefinishTime 的格式为 HH:MM
  • 00 <= HH <= 23
  • 00 <= MM <= 59
  • startTimefinishTime 不相等

解法

方法一:转换为分钟数

我们可以将输入的字符串转换为分钟数 $a$ 和 $b$,如果 $a > b$,则说明跨越了午夜,需要将 $b$ 加上一天的分钟数 $1440$。

然后我们将 $a$ 向上取整到 $15$ 的倍数,将 $b$ 向下取整到 $15$ 的倍数,最后返回 $b$ 与 $a$ 的差值即可,注意要取 $0$ 和 $b - a$ 中的较大值。

时间复杂度 $O(1)$,空间复杂度 $O(1)$。

class Solution:
  def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:
    def f(s: str) -> int:
      return int(s[:2]) * 60 + int(s[3:])

    a, b = f(loginTime), f(logoutTime)
    if a > b:
      b += 1440
    a, b = (a + 14) // 15, b // 15
    return max(0, b - a)
class Solution {
  public int numberOfRounds(String loginTime, String logoutTime) {
    int a = f(loginTime), b = f(logoutTime);
    if (a > b) {
      b += 1440;
    }
    return Math.max(0, b / 15 - (a + 14) / 15);
  }

  private int f(String s) {
    int h = Integer.parseInt(s.substring(0, 2));
    int m = Integer.parseInt(s.substring(3, 5));
    return h * 60 + m;
  }
}
class Solution {
public:
  int numberOfRounds(string loginTime, string logoutTime) {
    auto f = [](string& s) {
      int h, m;
      sscanf(s.c_str(), "%d:%d", &h, &m);
      return h * 60 + m;
    };
    int a = f(loginTime), b = f(logoutTime);
    if (a > b) {
      b += 1440;
    }
    return max(0, b / 15 - (a + 14) / 15);
  }
};
func numberOfRounds(loginTime string, logoutTime string) int {
  f := func(s string) int {
    var h, m int
    fmt.Sscanf(s, "%d:%d", &h, &m)
    return h*60 + m
  }
  a, b := f(loginTime), f(logoutTime)
  if a > b {
    b += 1440
  }
  return max(0, b/15-(a+14)/15)
}
function numberOfRounds(startTime: string, finishTime: string): number {
  const f = (s: string): number => {
    const [h, m] = s.split(':').map(Number);
    return h * 60 + m;
  };
  let [a, b] = [f(startTime), f(finishTime)];
  if (a > b) {
    b += 1440;
  }
  return Math.max(0, Math.floor(b / 15) - Math.ceil(a / 15));
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文