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

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

作者:互联网

文章目录

1. 题目来源

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


2. 题目解析

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

方法一:分类讨论

方法二:暴力模拟


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

空间复杂度: 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 "";
    }
};

标签:周赛,return,string,res,flag,sprintf,&&,time,模拟
来源: https://blog.csdn.net/yl_puyu/article/details/119062083