题目

小R要求小J说出他们认识了多久,精确到分钟。 小J需要一个程序来计算两个时间节点之间相差了多少分钟。

输入:共2行,分别表示起止时间(月 日 时 分),24小时制,范围均在2024年内,保证第一行早于第二行。
输出:1 个整数,表示两个时间节点之间相差的分钟数。

样例:
输入 4 1 21 21 / 4 1 21 22 → 输出 1
输入 6 30 23 49 / 7 1 6 30 → 输出 401

提示:
20% 的数据:两个时间节点在同一小时内。
40% 的数据:两个时间节点在同一天内。
60% 的数据:两个时间节点在同一月内。
100% 的数据:两个时间节点在 2024 年内。

思路

把两个时间点都换算成从 1月1日 00:00 起的总分钟数, 直接相减。跨月、跨天的边界情况全部自动处理。

分三步:先用循环累加前几个月的天数,加上当月已过天数(d-1), 乘以 1440 换算成分钟,最后加上当天的小时×60 和分钟数。

C++ · p40.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    int day_in_month[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int m1,d1,h1,f1,m2,d2,h2,f2;
    cin >> m1 >> d1 >> h1 >> f1;
    cin >> m2 >> d2 >> h2 >> f2;

    // 第一步:算出这一天是今年第几天
    int total_days1 = 0;
    int total_days2 = 0;
    for(int c = 0; c < m1-1; c++){
        total_days1 += day_in_month[c];
    }
    total_days1 += d1 - 1;
    for(int c = 0; c < m2-1; c++){
        total_days2 += day_in_month[c];
    }
    total_days2 += d2 - 1;

    // 第二步:天数乘1440换算成分钟
    int total_min1 = 1440 * total_days1;
    int total_min2 = 1440 * total_days2;

    // 第三步:加上当天的小时和分钟
    int today_min1 = 60 * h1 + f1;
    int today_min2 = 60 * h2 + f2;
    total_min1 += today_min1;
    total_min2 += today_min2;

    // 第四步:后减前
    int output = total_min2 - total_min1;
    cout << output << endl;

    return 0;
}

复杂度分析

  • 时间复杂度:O(1),月份循环最多 12 次。
  • 空间复杂度:O(1)。
今日感受

看到跨月跨天的时间差,第一反应是分情况讨论,容易漏掉边界。转念一想: 把两个时间都换算成同一基准下的总分钟数,直接相减,所有情况一口气解决。
还学到一个重要的点:局部变量(写在函数里的变量)不会自动初始化为 0,必须手动写 = 0, 否则里面是随机值,加起来结果就乱了。全局变量才默认是 0。

← 返回菜鸟的coding