ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-24 19:01:35  阅读:180  来源: 互联网

标签:周赛 return string res flag sprintf && time 模拟


文章目录

1. 题目来源

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


2. 题目解析

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

方法一:分类讨论

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

方法二:暴力模拟

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

时间复杂度: 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有