LeetCode-2437

力扣2437题

题目描述:有效时间的数目

给你一个长度为 5 的字符串 time ,表示一个电子时钟当前的时间,格式为 “hh:mm” 。最早 可能的时间是 “00:00” ,最晚 可能的时间是 “23:59” 。

在字符串 time 中,被字符 ? 替换掉的数位是 未知的 ,被替换的数字可能是 0 到 9 中的任何一个。

请你返回一个整数 answer ,将每一个 ? 都用 0 到 9 中一个数字替换后,可以得到的有效时间的数目。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-valid-clock-times
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1683597685449.jpg

**题解思路:**首先想到的就是遍历time的前面两个和后面两个,分多种情况讨论,结果分了将近一个小时还是有问题,遂果断看题解,看到一位大佬写的相当巧妙。记录下来,以示感谢。

① 分开枚举小时和分钟,小时最多24个,分钟最多60,统计满足要求的小时和分钟各有多少个,再相乘即可;

② 具体怎么枚举?

  • 先借助**substring()**获取我们需要遍历的前两个和后两个字符

  • 先小时:对于十位:每个位置判断是否是’?',是就为true,不是的话再判断这一位 s.charAt(0) - ‘0’ == i / 10?为true,说明有我们要找的,比如前两位是"2?":当我们从0~23中进行遍历,当 i 是20,21,22,23时,这几个数/10和"2?"/10的结果一样,都是2,所以有4个,记为a ;对于个位和同样,记为b

    如果 a&&b为true,说明这才是一个有效的数字,ans+1;

  • 再分钟:分钟在0~59之间,遍历方法和上面一样。

③ 返回小时和分钟的积即可。

代码如下:

class Solution {
    
    
     public int countTime(String time) {
    
    
        return func(time.substring(0,2), 24) * f(time.substring(3), 60);
    }

    public int func(String s, int m){
    
    
        int ans = 0;
        for(int i=0;i<m;i++){
    
    
            boolean a = s.charAt(0) == '?' || s.charAt(0) - '0' == i / 10;
            boolean b = s.charAt(1) == '?' || s.charAt(1) - '0' == i % 10;
            ans += a && b ? 1 : 0;
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/Miss_croal/article/details/130573891