持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 -> 有效时间的数目
题目描述
给你一个长度为 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,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。