说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给你一个长度为 5 的字符串 time ,表示一个电子时钟当前的时间,格式为 “hh:mm” 。最早 可能的时间是 “00:00” ,最晚 可能的时间是 “23:59” 。
在字符串 time 中,被字符 ? 替换掉的数位是 未知的 ,被替换的数字可能是 0 到 9 中的任何一个。
请你返回一个整数 answer ,将每一个 ? 都用 0 到 9 中一个数字替换后,可以得到的有效时间的数目。
示例 1:
输入:time = "?5:00" 输出:2 解释:我们可以将 ? 替换成 0 或 1 ,得到 "05:00" 或者 "15:00" 。注意我们不能替换成 2 ,因为时间 "25:00" 是无效时间。所以我们有两个选择。
示例 2:
输入:time = "0?:0?" 输出:100 解释:两个 ? 都可以被 0 到 9 之间的任意数字替换,所以我们总共有 100 种选择。
示例 3:
输入:time = "??:??" 输出:1440 解释:小时总共有 24 种选择,分钟总共有 60 种选择。所以总共有 24 * 60 = 1440 种选择。
提示:
- time 是一个长度为 5 的有效字符串,格式为 “hh:mm” 。
- “00” <= hh <= “23”
- “00” <= mm <= “59”
- 字符串中有的数位是 ‘?’ ,需要用 0 到 9 之间的数字替换。
思路分析
首先我们要先理解一下题目的意思,题目会给我们一个字符串,格式为 “hh:mm” ,表示一个电子时钟当前的时间。我们可以用0到9中的数字来替换字符串中的?
,我们需要计算替换后有效的时间个数。其中最早可能的时间是 00:00
,最晚可能的时间是 23:59
。
我们可以将字符串分为小时和分钟两部分,小时的第一位取值会影响到第二位的取值,分钟的第一位取值也会影响到第二位的取值,所以我们需要分情况来考虑。
- 1、小时以0或1开头时,第二位可以为0-9的任意一位
- 2、小时以2开头,第二位可以为0-3的任意一位
- 3、分钟为0到59,总共有60中取值
接下来我们根据?
的位置来计算其取值的可能性:
- 1、小时的第一位和第二位的为
?
小时的两位都为?
时,小时的取值为00 - 23
,总共为24种
- 2、小时的第一位为
?
且第二位大于3
此时第一位的取值为0 - 1
,共2种
- 3、小时的第一位为
?
且第二位小于等于3
此时第一位的取值为0 - 2
,共3种
- 4、小时的第二位为
?
且第一位等于2
此时第二位的取值为0 - 3
,共4种
- 5、小时的第二位为
?
且第一位不等于2
此时第二位的取值为0 - 9
,共10种
- 6、分钟的第一位为
?
且第二位为?
此时分钟的取值为00 - 59
,共60种
- 7、分钟的第二位为
?
且第一位不为?
此时分钟的第一位取值为0 - 5
,共6种
- 8、分钟的第二位为
?
且第一位不为?
此时分钟的第二位取值为0 - 9
,共10种
最后将分钟和小时各自的取值个数相乘即为有效的时间个数。
完整AC代码如下:
AC代码
/** * @param {string} time * @return {number} */ var countTime = function(time) { let a = 1,b = 1; if(time[0] == '?' && time[1] == '?') a = 24; else if(time[0] == '?') a = time[1] > 3 ? 2 : 3; else if(time[1] == '?') a = time[0] == '2' ? 4 : 10; if(time[3] == '?') b = 6; if(time[4] == '?') b = time[3] == '?' ? 60 : 10; return a * b; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。