把时间当成字符串来处理,分析每一个位置字符串可能出现的情况。

每一个字符串的格式都是完全相同的,从左到右依次分析:

记字符串的初始位置为 0。
那么判断一个时间是否合法,需要考虑的位置只有第 0、1、3 和 6 位。
例如:case = ['1', '9', ':', '0', '0', ':', '2', '3']

先来看小时 (0 位置和 1 位置):

  1. 小时的第一位只能是 0,1 或 2 case[0] 只能取 0,1,2 (合法直接跳过);
  2. 在小时第一位为 0 或 1 时,小时的第 2 位可以为 [0..9] case[0] 属于 [0..1] 时,case[1] 可以取 [0..9] (case[0] 和 case[1] 都不用更改);
  3. 在小时第一位为 2 时,小时的第二位只能取 0,1,2,3 case[0] == 2,case[1] 可以取 [0..3],如果此时 case[1] > 3,因为要求最小改动和字典序最小,那么只需要把 case[0] 的位置改成 0 就好了。例如 28 08;
  4. 当小时第一位大于 2 时,只要变成 0 就好了,因为在第二条中分析过,当 case[0] == 1 时,case[1] 可以取 [0..9]。

分钟和秒钟是一样的,只要左边(case[3] 和 case[6]) 大于 5,直接修改为 0 即可。例如:99 09、75 05。

按照这个思路写出代码如下:

def process(case):
    '''Modify time to valid value.

    case: list, ['1', '9', ':', '0', '0', ':', '2', '3']
                ['2', '8', ':', '1', '9', ':', '9', '7']
                ['3', '8', ':', '9', '9', ':', '9', '7']
    '''

    if case[0] == '2':
        if case[1] > '3':
            case[0] = '0'
    if case[0] > '2':
        case[0] = '0'
    if case[3] > '5':
        case[3] = '0'
    if case[6] > '5':
        case[6] = '0'


if __name__ == '__main__':
    case_count = int(input())
    for i in range(case_count):
        case = [x for x in input().strip()]
        process(case)
        print(''.join(case))