题目链接
题目描述
小红很喜欢刷小红书。她记录了一周七天、每天刷小红书的开始时间和结束时间。
请你帮小红计算她总共刷了多少分钟。
注意:
- 小红有可能在当天的凌晨12点后(即第二天)结束刷小红书。
- 保证开始时间一定迟于 17:00,结束时间一定早于 03:00。
思路分析
这是一个时间计算问题,核心是处理跨天的时间差。最直接的方法是将所有时间点转换为从一个共同参考点(例如,午夜00:00)开始的总分钟数。
1. 统一单位
我们将 HH:MM
格式的时间解析为小时和分钟,然后统一转换为分钟。转换公式为:总分钟数 = 小时 * 60 + 分钟
。
2. 处理跨天
题目保证了开始时间在当天 17:00 之后,结束时间在次日 03:00 之前。这提示我们可能会有跨天的情况,也可能有当天结束的情况。
-
将开始时间
start_str
和结束时间end_str
分别转换为start_minutes
和end_minutes
。 -
判断是否跨天:
- 如果
end_minutes < start_minutes
,说明结束时间在第二天。例如,开始于22:10
(1330分钟),结束于01:30
(90分钟)。 - 如果
end_minutes >= start_minutes
,说明活动在同一天内完成。例如,开始于18:00
(1080分钟),结束于20:00
(1200分钟)。
- 如果
-
计算时长:
- 跨天情况:时长 =
(end_minutes + 24 * 60) - start_minutes
。 - 当天情况:时长 =
end_minutes - start_minutes
。
- 跨天情况:时长 =
3. 循环累加
我们对一周七天的记录重复这个过程,并将每天计算出的分钟数累加起来,得到最终的总时长。
代码
#include <iostream>
#include <string>
using namespace std;
// 将 HH:MM 格式的字符串转换为分钟
int time_to_minutes(const string& time_str) {
size_t colon_pos = time_str.find(':');
int hour = stoi(time_str.substr(0, colon_pos));
int minute = stoi(time_str.substr(colon_pos + 1));
return hour * 60 + minute;
}
int main() {
long long total_minutes = 0;
const int days_in_week = 7;
const int minutes_in_day = 24 * 60;
for (int i = 0; i < days_in_week; ++i) {
string start_time_str, end_time_str;
cin >> start_time_str;
cin >> end_time_str;
int start_minutes = time_to_minutes(start_time_str);
int end_minutes = time_to_minutes(end_time_str);
if (end_minutes < start_minutes) {
// 跨天
total_minutes += (end_minutes + minutes_in_day) - start_minutes;
} else {
// 当天
total_minutes += end_minutes - start_minutes;
}
}
cout << total_minutes << endl;
return 0;
}
import java.util.Scanner;
public class Main {
// 将 HH:MM 格式的字符串转换为分钟
private static int timeToMinutes(String timeStr) {
String[] parts = timeStr.split(":");
int hour = Integer.parseInt(parts[0]);
int minute = Integer.parseInt(parts[1]);
return hour * 60 + minute;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long totalMinutes = 0;
final int daysInWeek = 7;
final int minutesInDay = 24 * 60;
for (int i = 0; i < daysInWeek; i++) {
String startTimeStr = sc.next();
String endTimeStr = sc.next();
int startMinutes = timeToMinutes(startTimeStr);
int endMinutes = timeToMinutes(endTimeStr);
if (endMinutes < startMinutes) {
// 跨天
totalMinutes += (endMinutes + minutesInDay) - startMinutes;
} else {
// 当天
totalMinutes += endMinutes - startMinutes;
}
}
System.out.println(totalMinutes);
}
}
def time_to_minutes(time_str):
"""将 HH:MM 格式的字符串转换为分钟"""
hour, minute = map(int, time_str.split(':'))
return hour * 60 + minute
total_minutes = 0
days_in_week = 7
minutes_in_day = 24 * 60
for _ in range(days_in_week):
start_time_str = input()
end_time_str = input()
start_minutes = time_to_minutes(start_time_str)
end_minutes = time_to_minutes(end_time_str)
if end_minutes < start_minutes:
# 跨天
total_minutes += (end_minutes + minutes_in_day) - start_minutes
else:
# 当天
total_minutes += end_minutes - start_minutes
print(total_minutes)
算法及复杂度
-
算法:模拟
-
时间复杂度:
。
- 程序总是执行固定的 7 次循环来处理一周的数据,因此时间复杂度是常数级别的。
-
空间复杂度:
。
- 我们只需要几个变量来存储总时间和当天的起止时间,空间开销是常数级别的。