力扣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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
**题解思路:**首先想到的就是遍历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;
}
}