返回介绍

solution / 0600-0699 / 0681.Next Closest Time / README

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

681. 最近时刻

English Version

题目描述

给定一个形如 "HH:MM" 表示的时刻 time ,利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。

你可以认为给定的字符串一定是合法的。例如, "01:34" "12:09" 是合法的,“1:34”“12:9” 是不合法的。

 

示例 1:

输入: "19:34"
输出: "19:39"
解释: 利用数字 1, 9, 3, 4 构造出来的最近时刻是 19:39,是 5 分钟之后。
结果不是 19:33 因为这个时刻是 23 小时 59 分钟之后。

示例 2:

输入: "23:59"
输出: "22:22"
解释: 利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。 
答案一定是第二天的某一时刻,所以选择可构造的最小时刻。

 

提示:

  • time.length == 5
  • time 为有效时间,格式为 "HH:MM".
  • 0 <= HH < 24
  • 0 <= MM < 60

解法

方法一

class Solution:
  def nextClosestTime(self, time: str) -> str:
    def check(t):
      h, m = int(t[:2]), int(t[2:])
      return 0 <= h < 24 and 0 <= m < 60

    def dfs(curr):
      if len(curr) == 4:
        if not check(curr):
          return
        nonlocal ans, d
        p = int(curr[:2]) * 60 + int(curr[2:])
        if t < p < t + d:
          d = p - t
          ans = curr[:2] + ':' + curr[2:]
        return
      for c in s:
        dfs(curr + c)

    s = {c for c in time if c != ':'}
    t = int(time[:2]) * 60 + int(time[3:])
    d = inf
    ans = None
    dfs('')
    if ans is None:
      mi = min(int(c) for c in s)
      ans = f'{mi}{mi}:{mi}{mi}'
    return ans
class Solution {
  private int t;
  private int d;
  private String ans;
  private Set<Character> s;

  public String nextClosestTime(String time) {
    t = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
    d = Integer.MAX_VALUE;
    s = new HashSet<>();
    char mi = 'z';
    for (char c : time.toCharArray()) {
      if (c != ':') {
        s.add(c);
        if (c < mi) {
          mi = c;
        }
      }
    }
    ans = null;
    dfs("");
    if (ans == null) {
      ans = "" + mi + mi + ":" + mi + mi;
    }
    return ans;
  }

  private void dfs(String curr) {
    if (curr.length() == 4) {
      if (!check(curr)) {
        return;
      }
      int p
        = Integer.parseInt(curr.substring(0, 2)) * 60 + Integer.parseInt(curr.substring(2));
      if (p > t && p - t < d) {
        d = p - t;
        ans = curr.substring(0, 2) + ":" + curr.substring(2);
      }
      return;
    }
    for (char c : s) {
      dfs(curr + c);
    }
  }

  private boolean check(String t) {
    int h = Integer.parseInt(t.substring(0, 2));
    int m = Integer.parseInt(t.substring(2));
    return 0 <= h && h < 24 && 0 <= m && m < 60;
  }
}

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

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

发布评论

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