[E模拟] lc1736. 替换隐藏数字得到的最晚时间(模拟+时间问题+sprintf函数+周赛225_1)

1. 题目来源

链接:1736. 替换隐藏数字得到的最晚时间


2. 题目解析

正则表达式匹配相关,?可以匹配任意字符

方法一:分类讨论

  • 时间有效位置就 4 位,暴力分情况即可。
  • 注意可能会有连续的 出现在字符串中,所以需要判断好情况。
  • 首个元素最难判断,要填 2 的话,第二个元素必须是 0~3 之间,或者是 ?
  • 一开始忘记分类的完整性,错了很多次…

方法二:暴力模拟

  • 按时间从大到小开始匹配,? 能匹配任意字符,若数字位和枚举的数字位不匹配,则当前时间不合法。
  • 找到第一个合法时间,由于是从大到小匹配,故即为答案。

时间复杂度: O ( 24 ∗ 60 ∗ 5 ) O(24*60*5) O(24605)

空间复杂度: O ( 1 ) O(1) O(1)


代码:

逻辑匹配,容易出错,需要分好情况…

class Solution {
public:
    string maximumTime(string time) {
        if (time[0] == '?') {
            if (time[1] >= '0' && time[1] <= '3' || time[1] == '?') time[0] = '2';
            else time[0] = '1';
        }
        if (time[1] == '?') {
            if (time[0] != '2') time[1] = '9';
            else time[1] = '3';
        }
        if (time[3] == '?') time[3] = '5';
        if (time[4] == '?') time[4] = '9';

        return time;
    }
};

从大到小匹配即可

class Solution {
public:
    string maximumTime(string time) {
        for (int i = 23; ~i; i -- ) {
            for (int j = 59; ~j; j -- ) {
                bool flag = false;
                if (time[0] != '?' && (time[0] - '0') != i / 10) flag = true;
                if (time[1] != '?' && (time[1] - '0') != i % 10) flag = true;
                if (time[3] != '?' && (time[3] - '0') != j / 10) flag = true;
                if (time[4] != '?' && (time[4] - '0') != j % 10) flag = true;

                if (!flag) {
                    string res;
                    if (i < 10) res += '0';
                    res += to_string(i);
                    res += ":";
                    if (j < 10) res += '0';
                    res += to_string(j);
                    
                    return res;
                }
            }
        }

        return "";
    }
};

一个简单的写法:注意使用 sprintf 将数字格式化到 str 数组中,并且在力扣输出中,string 类型也是可以直接返回一个 char 数组的。

class Solution {
public:
    bool check(char s[], string time) {
        for (int i = 0; i < 5; i ++ ) {
            if (time[i] != s[i] && time[i] != '?') 
                return false;
        }

        return true;
    }

    string maximumTime(string time) {
        for (int i = 23; ~i; i -- ) {
            for (int j = 59; ~j; j -- ) {
                char s[20];
                sprintf(s, "%02d:%02d", i, j);
                if (check(s, time))
                    return s;
            }
        }

        return "";
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值