有效时间的数目

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

题目描述

给你一个长度为 5 的字符串 time ,表示一个电子时钟当前的时间,格式为 "hh:mm" 。最早 可能的时间是 "00:00" ,最晚 可能的时间是 "23:59" 。
在字符串 time 中,被字符 ? 替换掉的数位是 未知的 ,被替换的数字可能是 0 到 9 中的任何一个。
请你返回一个整数 answer ,将每一个 ? 都用 0 到 9 中一个数字替换后,可以得到的有效时间的数目。
来源:力扣(LeetCode)

  • 示例 1
输入:time = "?5:00"
输出:2
解释:我们可以将 ? 替换成 01 ,得到 "05:00" 或者 "15:00" 。注意我们不能替换成 2 ,因为时间 "25:00" 是无效时间。所以我们有两个选择。
  • 示例 1
输入: time = "0?:0?"
输出: 100
解释: 两个 ? 都可以被 0 到 9 之间的任意数字替换,所以我们总共有 100 种选择。
  • 示例 1
输入:time = "??:??"
输出:1440
解释:小时总共有 24 种选择,分钟总共有 60 种选择。所以总共有 24 * 60 = 1440 种选择。

思路分析

根据题意可知,题目给出一个字符串time,表示一个电子时钟当前的时间,格式为 "hh:mm" 。最早 可能的时间是 "00:00" ,最晚 可能的时间是 "23:59" ;然而字符串中有若干个字符串?替换了其中的数字,并且数量是不知道的;现在需要我们求出可能组成正确时间的个数。
对于这种不知道有几个被替换的,只能一个一个假设了。首先假如小时位数的两个都是问号,那么小时的可能性就有24种;假如十位数为问号,个位数不是,就需要继续判断个位数是否小于4,若是则为3中,若不是则为2种;假如个位数为问号,十位数不为问号,就再判断十位数是否小于2,若是则为10种,若不是则为4种。
剩下的就判断分钟,若是分钟为问号则有6种,若秒钟是问号,则有10种。最后只要把这些乘起来就是最后的结果了。

AC代码

function solution(time) {
    let result = 1;
    if(time[0] === '?' && time[1] === '?') {
        result = 24;
    } else if (time[0] === '?' && time[1] !== '?' ) {
        result = time[1] < 4 ? 3 : 2;
    } else if(time[1] === '?') {
        result = time[0] < 2 ? 10 : 4;
    }
    if(time[3] === '?') {
        result *= 6;
    }
    if(time[4] === '?') {
        result *= 10;
    }
    console.log(result);
}
let time = "0?:0?";
solution(time);