top1编程
← 返回题目
题解

童童看书的时间

1 条题解

  • 0
    @ 2026-8-4 1:12:13

    解题思路

    题目给出看书开始时间和结束时间(都是“时 分”格式),求中间过了多少分钟。例如从 12:23 到 16:12,答案是 229 分钟。

    怎么算?如果把“几时几分”直接相减,会遇到借位问题:23 分减 12 分不够减,得从小时那里借 60 分钟,非常麻烦。好办法是统一换算成分钟:

    • 开始时刻的总分钟数:t1 = 时1×60 + 分1,12:23 → 12×60+23 = 743;
    • 结束时刻的总分钟数:t2 = 时2×60 + 分2,16:12 → 16×60+12 = 972;
    • 看书时间 = t2 - t1 = 972 − 743 = 229 分钟。

    为什么可以这样做?因为“几时”本质上就是“60 分钟 × 几”,把小时全部换算成分钟以后,两个时刻就都变成了同一条数轴上的点,直接相减就是它们之间的距离。题目保证第一个时间一定早于第二个,所以 t2 - t1 一定是正数,不用处理负数。

    把“时间的减法”变成“普通数字的减法”,就避开了借位的麻烦。这种方法叫“统一单位”,以后算时间差(从几点到几点、一共多少分钟)都用它。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int h1, m1, h2, m2;  // h1,m1:开始时间的时和分;h2,m2:结束时间的时和分
        cin >> h1 >> m1 >> h2 >> m2;  // 依次读入四个数字
        int t1;     // t1:开始时刻的总分钟数
        int t2;     // t2:结束时刻的总分钟数
        t1 = h1 * 60 + m1;   // 开始时间换算成分钟
        t2 = h2 * 60 + m2;   // 结束时间换算成分钟
        cout << t2 - t1 << endl;   // 两个分钟数相减,就是看书分钟数
        return 0;
    }
    

    复杂度分析

    程序只做几次乘法和加减法,运算次数固定,和时间的具体数值无关。所以时间复杂度是 O(1),空间复杂度也是 O(1)(只用了 6 个 int 变量)。

    虽然题目里有两个时间,但每个时间只参与一次换算,不会因为时间数值大就多算,所以仍然是常数时间。

    • 1