Duration - 题解
标签与难度
标签: 字符串处理, 数学, 模拟, 入门, 基础题 难度: 800
题目大意喵~
主人你好呀,这道题的任务很简单哦!题目会给我们两个在同一天内的时间点,格式都是 HH:MM:SS (时:分:秒)。我们需要计算出这两个时间点之间相差了多少秒,然后把这个秒数打印出来。
比如说,如果给的时间是 12:00:00 和 12:00:10,那它们之间就相差了 10 秒钟,对吧?如果给的是 13:30:00 和 12:30:00,它们就相差了 1 个小时,也就是 3600 秒。无论哪个时间在前,我们都只需要输出那个正数的差值就可以啦,喵~
解题思路分析
看到这道题,我们的小脑袋瓜里可能会冒出一个想法:直接用时、分、秒来做减法可以吗?比如 13:05:10 减去 12:55:20。
- 秒:
10 - 20,不够减,要向分钟借位... - 分:借了1分钟变成
04分,再减55分,还是不够减,要向小时借位... - 时:... 呀,这样计算起来好麻烦,就像我数不清猫抓板上有多少道抓痕一样,很容易出错的呢!
所以,我们需要一个更聪明的办法!当遇到这种由不同单位(时、分、秒)组成的数据时,一个超级好用的技巧就是**“统一单位大法”**!也就是说,我们把所有的单位都转换成最小的那个单位。在这里,最小的单位就是“秒”,呐。
我们可以把一天开始的 00:00:00 作为我们的“零点”。然后,任何一个时间点,我们都可以计算出它距离这个“零点”一共通行了多少秒。
换算的公式非常简单:
- 1 小时 = 60 分钟
- 1 分钟 = 60 秒
- 所以,1 小时 = 60 × 60 = 3600 秒
那么,对于一个 HH:MM:SS 格式的时间,它距离零点 00:00:00 的总秒数就是:
举个栗子,01:02:03 这个时间点,换算成总秒数就是: 秒。
只要我们把输入的两个时间点都用这个方法转换成总秒数,比如得到了 total_seconds_1 和 total_seconds_2,那么它们之间相差的秒数不就是这两个总秒数之差的绝对值嘛!
用数学语言来说,就是:
使用绝对值函数 abs() 可以确保我们得到的结果永远是正数,就不用关心哪个时间更早哪个时间更晚啦,是不是超级方便?
所以,我们的解题步骤就是:
- 读取两个
HH:MM:SS格式的时间字符串。 - 解析这两个字符串,分别提取出时(HH)、分(MM)、秒(SS)。
- 转换:利用公式将两个时间都转换为从午夜开始的总秒数。
- 计算:求这两个总秒数的差的绝对值。
- 输出结果!喵~
代码实现
下面是我根据这个思路精心准备的 C++ 代码哦!我把时间转换的部分写成了一个小小的函数,这样代码看起来更整洁,也更容易复用呢。
#include <iostream>
#include <string>
#include <cmath> // 引入 cmath 库来使用 abs() 函数
// 一个辅助函数,专门用来把 HH:MM:SS 格式的时间转换成总秒数
// 这样可以让主函数逻辑更清晰哦,喵~
long long timeToSeconds(int hours, int minutes, int seconds) {
return hours * 3600LL + minutes * 60LL + seconds;
}
int main() {
// 为了让输入输出更快一点,这是个好习惯~
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
// 定义变量来存储两个时间的时、分、秒
int h1, m1, s1;
int h2, m2, s2;
char colon; // 这个变量是用来“吃掉”冒号的,我们不需要它
// 读取第一个时间
// cin 会自动按空格和换行分割,所以我们可以巧妙地用它来读取数字并跳过冒号
std::cin >> h1 >> colon >> m1 >> colon >> s1;
// 读取第二个时间
std::cin >> h2 >> colon >> m2 >> colon >> s2;
// 调用我们的辅助函数,计算出两个时间点各自的总秒数
long long totalSeconds1 = timeToSeconds(h1, m1, s1);
long long totalSeconds2 = timeToSeconds(h2, m2, s2);
// 计算两个总秒数之差的绝对值
long long difference = std::abs(totalSeconds1 - totalSeconds2);
// 打印结果,任务完成!
std::cout << difference << std::endl;
return 0;
}复杂度分析
时间复杂度: 我们的程序只执行了固定次数的读入、几次乘法和加法、一次减法和一次求绝对值操作。这些操作的执行时间不随输入值的大小而改变,所以时间复杂度是常数级别的,也就是 的说。
空间复杂度: 我们只使用了几个变量(
h1,m1,s1,h2,m2,s2,colon,totalSeconds1,totalSeconds2,difference)来存储时间和计算结果。这些变量占用的内存是固定的,不会因为输入的不同而增多。所以空间复杂度也是常数级别的 ,喵~
知识点总结
这道题虽然简单,但背后的小技巧在很多问题里都很有用哦!
统一单位/基准转换: 这是解决混合单位问题的核心思想。无论是时间(时分秒)、长度(千米米厘米)还是其他度量,将它们全部转换为一个统一的最小单位,可以大大简化计算。
格式化输入: 在 C++ 中,
std::cin可以很方便地处理被非数字字符(如本题的冒号)隔开的数字输入。std::cin >> h >> colon >> m >> colon >> s;这样的写法比手动解析字符串要简洁和安全得多。在 C 语言中,scanf("%d:%d:%d", &h, &m, &s);也能达到同样的效果。绝对值函数:
std::abs()(在<cmath>或<cstdlib>中) 是个非常有用的工具,当你只关心两个数的差值大小而不关心它们的顺序时,它就是你的好朋友!
希望这篇题解能帮助到你,如果还有其他问题,随时可以来问我哦!一起加油,喵~!