题目地址:https://leetcode-cn.com/problems/latest-time-by-replacing-hidden-digits/
给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。 有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。 替换time 中隐藏的数字,返回你可以得到的最晚有效时间。
示例 1:
输入:time = "2?:?0"
输出:"23:50"
解释:以数字 '2' 开头的最晚一小时是 23 ,以 '0' 结尾的最晚一分钟是 50 。
示例 2:
输入:time = "0?:3?"
输出:"09:39"
示例 3:
输入:time = "1?:22"
输出:"19:22"
https://leetcode-cn.com/problems/latest-time-by-replacing-hidden-digits/
提示:time 的格式为 hh:mm 题目数据保证你可以由输入的字符串生成有效的时间 https://leetcode-cn.com/problems/latest-time-by-replacing-hidden-digits/
这道题主要有几个限制,首先时上如果第二位>4则第一个为不能为2,同样如果第一位=2则第二位不能>3
分上面无脑5和9就行,没有什么顾及,所以这道题的重点在时
于是就出现了以第一个爆破法
一、爆破法一
执行结果如下:
159 / 159 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 36.7 MB
public static String maximumTimeMe(String time) {
char[] ansArr = time.toCharArray();
for (int i = 0; i < ansArr.length; i++) {
if ('?' == ansArr[i])
switch (i) {
case 0:
ansArr[i] = ansArr[1] < '4' || ansArr[1] == '?' ? '2' : '1';
break;
case 1:
ansArr[i] = ansArr[0] == '2' ? '3' : '9';
break;
case 3:
ansArr[i] = '5';
break;
case 4:
ansArr[i] = '9';
break;
default:
break;
}
}
return new String(ansArr);
}
时间:52% 空间:41%,作为一个胜负欲星人肯定是不满意的,所以我们想到了一个爆破中的爆破法:
二、爆破法二
执行结果如下:
159 / 159 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 36 MB
public static String maximumTimeMe2(String time) {
char[] ansArr = time.toCharArray();
for (int i = 0; i < ansArr.length; i++) {
if ('?' == ansArr[i])
switch (i) {
case 0:
if ('?' == ansArr[1]) {
ansArr[0] = '2';
ansArr[1] = '3';
} else {
ansArr[0] = ansArr[1] < '4' ? '2' : '1';
}
i += 2;
break;
case 1:
ansArr[i] = ansArr[0] == '2' ? '3' : '9';
i += 1;
break;
case 3:
ansArr[i] = '5';
break;
case 4:
ansArr[i] = '9';
break;
}
}
return new String(ansArr);
}
时间100%,空间50%。这个空间我还是很不满意,莫非还能不用char[]数组做?
试试总感觉用StringBuilder空间会比数组更大,所以我们还是直接看看评论区的大佬们怎么写的。
试了一下评论区的大佬们的算法都是双50左右,于是我看了一下
?????同一段代码的空间差别这么大?最后一次执行直接时间100%,空间99.7%。。
我吐了。果然leetcode的百分比不是一定的,以后觉得自己很perface的时候试试多执行几次hhhhhh。
(盲猜时因为测试用例的不同,但是我没有证据。。。)