题目链接

小红刷小红书-时间计算

题目描述

小红很喜欢刷小红书。她记录了一周七天、每天刷小红书的开始时间和结束时间。

请你帮小红计算她总共刷了多少分钟。

注意:

  • 小红有可能在当天的凌晨12点后(即第二天)结束刷小红书。
  • 保证开始时间一定迟于 17:00,结束时间一定早于 03:00。

思路分析

这是一个时间计算问题,核心是处理跨天的时间差。最直接的方法是将所有时间点转换为从一个共同参考点(例如,午夜00:00)开始的总分钟数。

1. 统一单位

我们将 HH:MM 格式的时间解析为小时和分钟,然后统一转换为分钟。转换公式为:总分钟数 = 小时 * 60 + 分钟

2. 处理跨天

题目保证了开始时间在当天 17:00 之后,结束时间在次日 03:00 之前。这提示我们可能会有跨天的情况,也可能有当天结束的情况。

  • 将开始时间 start_str 和结束时间 end_str 分别转换为 start_minutesend_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 次循环来处理一周的数据,因此时间复杂度是常数级别的。
  • 空间复杂度

    • 我们只需要几个变量来存储总时间和当天的起止时间,空间开销是常数级别的。