题解 | ranko的手表

ranko的手表

https://www.nowcoder.com/practice/37275e85ae7c4453920eae6b9f7f45fc

解题思路

  1. 问题分析

    • 需要处理带有'?'的时间格式
    • 每个'?'可以是 的任意数字
    • 需要考虑时间的合法性(小时 ,分钟
    • 计算两个时间之间的分钟差
  2. 实现步骤

    • 找出所有 可能的合法时间
    • 计算所有可能的时间差
    • 找出最大和最小时间差

代码

#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <climits>  // 添加此头文件以使用INT_MAX和INT_MIN
using namespace std;

// 检查时间是否合法
bool isValidTime(int hour, int minute) {
    return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59;
}

// 获取所有可能的时间(分钟表示)
set<int> getPossibleTimes(string time) {
    set<int> times;
    
    // 处理小时
    vector<int> possibleHours;
    if (time[0] == '?' && time[1] == '?') {
        for (int i = 0; i <= 23; i++) possibleHours.push_back(i);
    } else if (time[0] == '?') {
        int d2 = time[1] - '0';
        for (int i = 0; i <= 2; i++) {
            if (isValidTime(i * 10 + d2, 0)) {
                possibleHours.push_back(i * 10 + d2);
            }
        }
    } else if (time[1] == '?') {
        int d1 = time[0] - '0';
        for (int i = 0; i <= 9; i++) {
            if (isValidTime(d1 * 10 + i, 0)) {
                possibleHours.push_back(d1 * 10 + i);
            }
        }
    } else {
        int hour = (time[0] - '0') * 10 + (time[1] - '0');
        if (isValidTime(hour, 0)) possibleHours.push_back(hour);
    }
    
    // 处理分钟
    vector<int> possibleMinutes;
    if (time[3] == '?' && time[4] == '?') {
        for (int i = 0; i <= 59; i++) possibleMinutes.push_back(i);
    } else if (time[3] == '?') {
        int d2 = time[4] - '0';
        for (int i = 0; i <= 5; i++) {
            possibleMinutes.push_back(i * 10 + d2);
        }
    } else if (time[4] == '?') {
        int d1 = time[3] - '0';
        for (int i = 0; i <= 9; i++) {
            possibleMinutes.push_back(d1 * 10 + i);
        }
    } else {
        possibleMinutes.push_back((time[3] - '0') * 10 + (time[4] - '0'));
    }
    
    // 组合所有可能的时间
    for (int h : possibleHours) {
        for (int m : possibleMinutes) {
            times.insert(h * 60 + m);
        }
    }
    
    return times;
}

int main() {
    string t1, t2;
    cin >> t1 >> t2;
    
    set<int> times1 = getPossibleTimes(t1);
    set<int> times2 = getPossibleTimes(t2);
    
    int minDiff = INT_MAX;
    int maxDiff = INT_MIN;
    
    for (int time1 : times1) {
        for (int time2 : times2) {
            if (time2 > time1) {  // t1必须在t2之前
                int diff = time2 - time1;
                minDiff = min(minDiff, diff);
                maxDiff = max(maxDiff, diff);
            }
        }
    }
    
    cout << minDiff << " " << maxDiff << endl;
    return 0;
}

import java.util.*;

public class Main {
    // 检查时间是否合法
    static boolean isValidTime(int hour, int minute) {
        return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59;
    }
    
    // 获取所有可能的时间(分钟表示)
    static Set<Integer> getPossibleTimes(String time) {
        Set<Integer> times = new HashSet<>();
        char[] t = time.toCharArray();
        
        // 处理小时
        List<Integer> possibleHours = new ArrayList<>();
        if (t[0] == '?' && t[1] == '?') {
            for (int i = 0; i <= 23; i++) possibleHours.add(i);
        } else if (t[0] == '?') {
            int d2 = t[1] - '0';
            for (int i = 0; i <= 2; i++) {
                if (isValidTime(i * 10 + d2, 0)) {
                    possibleHours.add(i * 10 + d2);
                }
            }
        } else if (t[1] == '?') {
            int d1 = t[0] - '0';
            for (int i = 0; i <= 9; i++) {
                if (isValidTime(d1 * 10 + i, 0)) {
                    possibleHours.add(d1 * 10 + i);
                }
            }
        } else {
            int hour = (t[0] - '0') * 10 + (t[1] - '0');
            if (isValidTime(hour, 0)) possibleHours.add(hour);
        }
        
        // 处理分钟
        List<Integer> possibleMinutes = new ArrayList<>();
        if (t[3] == '?' && t[4] == '?') {
            for (int i = 0; i <= 59; i++) possibleMinutes.add(i);
        } else if (t[3] == '?') {
            int d2 = t[4] - '0';
            for (int i = 0; i <= 5; i++) {
                possibleMinutes.add(i * 10 + d2);
            }
        } else if (t[4] == '?') {
            int d1 = t[3] - '0';
            for (int i = 0; i <= 9; i++) {
                possibleMinutes.add(d1 * 10 + i);
            }
        } else {
            possibleMinutes.add((t[3] - '0') * 10 + (t[4] - '0'));
        }
        
        // 组合所有可能的时间
        for (int h : possibleHours) {
            for (int m : possibleMinutes) {
                times.add(h * 60 + m);
            }
        }
        
        return times;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String t1 = sc.next();
        String t2 = sc.next();
        
        Set<Integer> times1 = getPossibleTimes(t1);
        Set<Integer> times2 = getPossibleTimes(t2);
        
        int minDiff = Integer.MAX_VALUE;
        int maxDiff = Integer.MIN_VALUE;
        
        for (int time1 : times1) {
            for (int time2 : times2) {
                if (time2 > time1) {  // t1必须在t2之前
                    int diff = time2 - time1;
                    minDiff = Math.min(minDiff, diff);
                    maxDiff = Math.max(maxDiff, diff);
                }
            }
        }
        
        System.out.println(minDiff + " " + maxDiff);
    }
}
def is_valid_time(hour, minute):
    return 0 <= hour <= 23 and 0 <= minute <= 59

def get_possible_times(time):
    times = set()
    
    # 处理小时
    possible_hours = []
    if time[0] == '?' and time[1] == '?':
        possible_hours = [i for i in range(24)]
    elif time[0] == '?':
        d2 = int(time[1])
        possible_hours = [i * 10 + d2 for i in range(3) if is_valid_time(i * 10 + d2, 0)]
    elif time[1] == '?':
        d1 = int(time[0])
        possible_hours = [d1 * 10 + i for i in range(10) if is_valid_time(d1 * 10 + i, 0)]
    else:
        hour = int(time[0:2])
        if is_valid_time(hour, 0):
            possible_hours = [hour]
    
    # 处理分钟
    possible_minutes = []
    if time[3] == '?' and time[4] == '?':
        possible_minutes = [i for i in range(60)]
    elif time[3] == '?':
        d2 = int(time[4])
        possible_minutes = [i * 10 + d2 for i in range(6)]
    elif time[4] == '?':
        d1 = int(time[3])
        possible_minutes = [d1 * 10 + i for i in range(10)]
    else:
        possible_minutes = [int(time[3:5])]
    
    # 组合所有可能的时间
    for h in possible_hours:
        for m in possible_minutes:
            times.add(h * 60 + m)
    
    return times

# 读入数据
t1 = input()
t2 = input()

# 获取所有可能的时间
times1 = get_possible_times(t1)
times2 = get_possible_times(t2)

# 计算最大最小时间差
min_diff = float('inf')
max_diff = float('-inf')

for time1 in times1:
    for time2 in times2:
        if time2 > time1:  # t1必须在t2之前
            diff = time2 - time1
            min_diff = min(min_diff, diff)
            max_diff = max(max_diff, diff)

print(min_diff, max_diff)

算法及复杂度分析

  • 算法:枚举

  • 时间复杂度

    • 对于每个时间点,最多有 种可能
    • 需要比较两个时间点的所有组合
    • ,其中 是两个时间点的可能数量
  • 空间复杂度,存储所有可能的时间点

注意事项

  1. 时间合法性检查

    • 小时:
    • 分钟:
  2. 边界条件

    • 必须在 之前
    • 处理'?'的所有可能情况
  3. 优化点

    • 使用 存储时间避免重复
    • 提前过滤不合法的时间
    • 转换为分钟计算更方便
全部评论

相关推荐

不愿透露姓名的神秘牛友
01-15 20:52
黑皮白袜臭脚体育生:五宿大战是吧,死去的记忆还在攻击我
点赞 评论 收藏
分享
01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务