题解
童童看书的时间
1 条题解
-
0
解题思路
题目给出看书开始时间和结束时间(都是“时 分”格式),求中间过了多少分钟。例如从 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