一、题目:替换隐藏数字得到的最晚时间
1. 描述
给你一个字符串 time
,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。替换 time
中隐藏的数字,返回你可以得到的最晚有效时间。
2. 提示和要求
time
的格式为 hh:mm- 题目数据保证你可以由输入的字符串生成有效的时间
3. 示例
- 示例一
输入:time = "2?:?0"
输出:"23:50"
解释:以数字 '2' 开头的最晚一小时是 23 ,以 '0' 结尾的最晚一分钟是 50 。
- 示例二
输入:time = "0?:3?"
输出:"09:39"
- 示例三
输入:time = "1?:22"
输出:"19:22"
二、解题
1. 思路
-
时间最晚即满足输出的字符串在符合有效时间的要求内数字最大。
-
贪心算法——为了保证整体最大,可以从高位开始保证每一位的数字都是符合要求内最大的。
-
因为题目最多只需要考虑四位数,所以可以依次处理这四个数:
(为了方便操作,把String time
转化成char[] arr
)-
arr[1]
的取值只能是 1 1 1或 2 2 2,显然在arr[1]
属于 [ 4 , 9 ] [4,9] [4,9] 的时候,arr[0]
不可以取 2 2 2,根据题目要求不存在时间24:??
等。在arr[1]
属于 [ 0 , 3 ] [0,3] [0,3] 的时候,显然arr[0]
取 2 2 2 使整体更大。 -
如果
arr[0]
的值已经确定为 2 2 2,则arr[1]
的最大的取值为 3 3 3,如果arr[0]
的值确定为 1 1 1,则arr[1]
的最大的取值为 9 9 9; -
arr[3]
的取值不受其余位数的影响,最大为 5 5 5; -
arr[4]
的取值不受其余位数的影响,最大为 9 9 9。
(题目要求返回
String
,将char[] arr
再转化为String
来返回 ) -
2. 代码
class Solution {
public String maximumTime(String time) {
char[] arr = time.toCharArray();
if(arr[0] == '?'){
arr[0] = ('4' <= arr[1] && arr[1] <= '9') ? '1' : '2';
}
if(arr[1]=='?'){
arr[1] = (arr[0]=='2') ? '3':'9';
}
if(arr[3]=='?')
arr[3]='5';
if(arr[4]=='?')
arr[4]='9';
return new String(arr);
}
}