Easy
题目描述
给你一个字符串 s,表示一个 12 小时制的时间格式,其中一些数字(可能没有)被 “?” 替换了。
12 小时制时间的格式为 “HH:MM”,其中 HH 在 00 到 11 之间,MM 在 00 到 59 之间。最早的 12 小时制时间是 00:00,最晚的是 11:59。
你需要将 s 中的所有 “?” 字符替换为数字,使得替换后的字符串表示一个有效的 12 小时制时间,并且是可能的最晚时间。
返回替换后的字符串。
示例 1:
输入:s = "1?:?4"
输出:"11:54"
解释:通过替换 "?" 字符能得到的最晚 12 小时制时间是 "11:54"。
示例 2:
输入:s = "0?:5?"
输出:"09:59"
解释:通过替换 "?" 字符能得到的最晚 12 小时制时间是 "09:59"。
提示:
s.length == 5s[2]等于字符 “:”- 除了
s[2]之外的所有字符都是数字或 “?” 字符 - 输入保证在替换 “?” 字符后,你可以得到一个在 “00:00” 和 “11:59” 之间的时间
解题思路
这道题要求我们将时间字符串中的 “?” 替换为数字,使得结果是有效的 12 小时制时间中最晚的。
解题思路:
由于时间格式固定为 “HH:MM”,我们可以从左到右贪心地处理每个位置的 “?":
小时十位(位置0):如果是 “?",要使时间最晚,应该尽可能取大值。但要考虑小时个位的限制:
- 如果小时个位是 0-1 或 “?",十位可以取 1
- 否则十位只能取 0(因为 12 小时制最大是 11:59)
小时个位(位置1):如果是 “?",在十位确定后选择最大可能值:
- 如果十位是 1,个位最大是 1
- 如果十位是 0,个位最大是 9
分钟十位(位置3):如果是 “?",最大取 5(因为分钟最大是 59)
分钟个位(位置4):如果是 “?",最大取 9
这种贪心策略能保证得到最晚的有效时间。
代码实现
class Solution {
public:
string findLatestTime(string s) {
// 处理小时十位
if (s[0] == '?') {
if (s[1] == '?' || s[1] <= '1') {
s[0] = '1';
} else {
s[0] = '0';
}
}
// 处理小时个位
if (s[1] == '?') {
if (s[0] == '1') {
s[1] = '1';
} else {
s[1] = '9';
}
}
// 处理分钟十位
if (s[3] == '?') {
s[3] = '5';
}
// 处理分钟个位
if (s[4] == '?') {
s[4] = '9';
}
return s;
}
};
class Solution:
def findLatestTime(self, s: str) -> str:
s = list(s)
# 处理小时十位
if s[0] == '?':
if s[1] == '?' or s[1] <= '1':
s[0] = '1'
else:
s[0] = '0'
# 处理小时个位
if s[1] == '?':
if s[0] == '1':
s[1] = '1'
else:
s[1] = '9'
# 处理分钟十位
if s[3] == '?':
s[3] = '5'
# 处理分钟个位
if s[4] == '?':
s[4] = '9'
return ''.join(s)
public class Solution {
public string FindLatestTime(string s) {
char[] chars = s.ToCharArray();
// 处理小时十位
if (chars[0] == '?') {
if (chars[1] == '?' || chars[1] <= '1') {
chars[0] = '1';
} else {
chars[0] = '0';
}
}
// 处理小时个位
if (chars[1] == '?') {
if (chars[0] == '1') {
chars[1] = '1';
} else {
chars[1] = '9';
}
}
// 处理分钟十位
if (chars[3] == '?') {
chars[3] = '5';
}
// 处理分钟个位
if (chars[4] == '?') {
chars[4] = '9';
}
return new string(chars);
}
}
var findLatestTime = function(s) {
let chars = s.split('');
// 处理小时十位
if (chars[0]
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(1) - 只需要检查和替换固定的 4 个位置 |
| 空间复杂度 | O(1) - 除了输入输出,只使用常数额外空间 |