1736 替换隐藏数字得到的最晚时间

方法一:贪心 + 模拟
time 字符数组中的问号 ?
代表可以填写任意数字,在求得最晚时间时,不管问号出现在哪一个时间位,不管出现几次,我都试图取得该位置以及关联位置【时间的组成方式】的最大时间
分别使用四个变量,初值为其字符数组中对应位置的值,操作上按照特判 + 覆写的基本思路
分别判断第一位,第二位,第四位与第五位,其中后两位无需特别处置,进制分别为6和10,分钟进制为60;
后两位如果为问号,则直接赋予每个位上最大值;
前两位中,先按照贪心的思路,当第一位为问号则赋予最大值2
,否则不处理。暂不考虑第二位;
分别考虑第二位为问号或者为数值时,根据第一位确定第二位的值,和根据第二位覆写第一位的值;
Python版本
C++版本
复杂度分析
时间复杂度:O(1)。
空间复杂度:O(1)。
备注【代码优化过程】
代码优化思路:充分利用默认值,减少代码覆写
逻辑合并,更多地使用三元运算符
思维缺陷:顺序思维,没有考虑到小时中,第一位和第二位的关联性,即24进制,2进制和10进制对两个数位的数值上限限制
V1
不足: 顺序思考存在缺陷—>没有充分利用默认值,造成代码冗余
没通过的测试样例 "?4:03"
预期输出 "14:03"
, 实际输出 "24:03"
,
当第二位为确值,而第一位为任意值时,没能处理好超限,因为第二位如果大于3,第一位最大为1
V2
WA: "00:01", 预期答案:"20:01", 实际输出 "00:01"
出错原因:当第二位非任意值时,没有判断第一位是否为任意值,直接将其赋值为2;
V3
逻辑增加:
逻辑增加:当第二位为数字时,如果第一位恰好为问号,那么我们在判断第一位为问号时,所作修改时,直接改为最大的2.当遍历到第二位,且第二位本身为数值,第一位为任意值时,就需要跟随第二位而变动第一位
具体而言,如果第二位大于3,则第一位只能填写1,其他则可以填写2
V4
优化:直接使用字符,字符间减法,无需类型转换
WA: "00:01", 预期结果: "00:01", 实际结果: "10:01",
原因:字符类型转整数类型错误,逻辑错误,
当第二位不是问号时,应该判断第一位是否为问号,如果是问号,则直接赋值为2,否则赋值为1 其次,当第二位为问号时,应当判断第一位的状态,因为率先判断第一位是否为问号并且完成赋值,因此当前轮次判断第二位为问号时,应当以第一位的数值为基准,而不是time[0],如果以后者作为判断条件
那么第一轮的判断需要重新判断
V4 代码优化
优化点:初始化时已经读取了对应位序的字符,如果当前非任意字符或者其他条件时,才需要对默认值进行修改
优点:利用初始化,减少代码量
V5 代码优化【ChatGPT】
优化:逻辑合并
对于小时的组合,当 value| ‘?’
,只有23和 1/0 | 9两种组合,可以使用三元运算符表达
对于小时的组合,当 ‘?’ | value
, 只有1 | n(n > 3) 和 2 | n(n=1,2,3)
,两种组合