纪念日
题目
小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 和分钟数。
#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。