2651. 计算列车到站时间

给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。

返回列车实际到站的时间。

注意,该问题中的时间采用 24 小时制。

示例 1:

输入:arrivalTime = 15, delayedTime = 5 
输出:20 
解释:列车正点到站时间是 15:00 ,延误 5 小时,所以列车实际到站的时间是 15 + 5 = 20(20:00)。

示例 2:

输入:arrivalTime = 13, delayedTime = 11
输出:0
解释:列车正点到站时间是 13:00 ,延误 11 小时,所以列车实际到站的时间是 13 + 11 = 24(在 24 小时制中表示为 00:00 ,所以返回 0)。

提示:

  • 1 <= arrivaltime < 24
  • 1 <= delayedTime <= 24

代码:

class Solution {
public:
    int findDelayedArrivalTime(int arrivalTime, int delayedTime) {
        int res = arrivalTime + delayedTime;
        return (res % 24);
    }
};

<think>嗯,用户想用C++计算列车实际到站时间,给出预计时间和延误时间。首先,我需要理解问题。实际到达时间等于预计时间加上延误时间。关键是如何在C++中处理时间计算,尤其是24小时制下的处理。 那C++的时间处理库,应该用chrono库吧。记得chrono库里有时间点和持续时间的类型。比如,time_point表示某个时间点,duration表示时间间隔。用户给的预计到达时间可能是一个具体的时间点,比如小时和分钟,而延误时间可能是分钟数或者小时数。 首先,需要将预计时间转换为一个time_point,然后加上延误的duration,得到新的时间点。但如何构造预计时间的time_point呢?可能需要使用一个固定的日期,比如当天的时间,或者假设从午夜开始计算。 比如,用户输入的小时和分钟,比如14:30,延误30分钟,结果应该是15:00。这时候,可以把预计时间表示为从当天午夜开始的duration,比如14小时30分钟。然后加上延误时间,再对24小时取模,确保不超过24小时。 那在C++中,如何处理呢?可能需要将输入的小时和分钟转换为一个duration,比如hours和minutes的组合。然后加上延误的duration,总和后转换成小时和分钟。 不过,chrono库中的duration可以直接相加,并且会自动处理进位。例如,30分钟加上70分钟,会自动变成1小时40分钟。所以,将预计时间转换为总分钟数,加上延误时间,再转换为小时和分钟。 那具体步骤可能是这样的: 1. 用户输入预计到达时间的小时和分钟,比如14和30。 2. 用户输入延误时间,比如30分钟。 3. 将预计时间转换为duration:14h + 30min。 4. 将延误时间转换为duration:30min。 5. 计算时间:预计时间 + 延误时间。 6. 将总时间转换为总分钟数,然后计算小时和分钟,注意超过24小时的情况需要取模。 但用chrono库的话,可以直接处理duration的加法。例如,hours和minutes类型可以相加,但需要统一类型。或者,将预计时间和延误时间都转换为分钟,然后相加,再转换为小时和分钟。 或者,使用chrono的duration_cast来处理不同的duration类型。例如,预计时间的小时和分钟分别转换成minutes,然后相加,再加上延误的分钟数,得到总分钟数。然后,总分钟数对(24*60)取模,得到当天的总分钟数,再分解成小时和分钟。 这可能更直接。比如: int预计小时,预计分钟; int延误分钟; 总分钟数 = (预计小时 * 60 + 预计分钟 + 延误分钟) % (24 * 60); 然后小时 = 总分钟数 / 60,分钟 = 总分钟数 % 60。 这样可能更简单,不需要使用chrono库的时间点和时钟。但用户可能希望用C++的时间库来处理,比如chrono,这样更符合现代C++的做法。 不过,chrono库中的duration可以处理这些计算。例如: auto total_time = std::chrono::hours(hours) + std::chrono::minutes(minutes) + delay_duration; 然后,total_time可能超过24小时,所以需要对其进行取模。例如,用total_time % std::chrono::hours(24)来得到当天的剩余时间。 或者,将总时间转换为自午夜以来的持续时间,然后转换为小时和分钟。 例如: #include <chrono> using namespace std::chrono; // 预计时间的小时和分钟 int expected_h = 14; int expected_m = 30; // 延误时间 int delay_minutes = 30; // 计算总持续时间 auto total_duration = hours(expected_h) + minutes(expected_m) + minutes(delay_minutes); // 转换为当天的总分钟数,并取模24小时 auto total_mins = duration_cast<minutes>(total_duration) % (24 * 60); // 分解小时和分钟 int h = total_mins.count() / 60; int m = total_mins.count() % 60; 这样就能得到正确的时间了。这种方法利用了chrono库的duration计算,并且处理了超过24小时的情况。 那在代码中,如何将用户输入的小时、分钟和延误时间转换为这些duration呢? 例如,用户输入预计时间是14:30,延误30分钟,那么: auto expected = hours(14) + minutes(30); auto delay = minutes(30); auto total = expected + delay; 然后,对总时间进行取模,得到当天的有效时间。 但duration的取模操作是否可行?可能需要将总duration转换为分钟数,再进行取模。或者,使用duration_cast。 例如: auto total_duration = expected + delay; auto total_duration_in_mins = duration_cast<minutes>(total_duration); total_duration_in_mins = total_duration_in_mins % (24 * 60); 然后分解小时和分钟。 这可能更直接,因为duration的取模需要相同类型的duration。比如,用minutes类型的总分钟数对minutes(24*60)取模。 这样处理的话,代码会更简洁。 那整个程序的步骤应该是: 1. 读取预计到达时间的小时和分钟。 2. 读取延误时间(假设为分钟)。 3. 计算总持续时间 = 预计时间 + 延误时间。 4. 将总持续时间转换为分钟,并取模1440(24*60)分钟。 5. 得到小时和分钟。 然后输出结果。 在C++中,使用chrono库的话,可以这样实现: #include <iostream> #include <chrono> using namespace std::chrono; int main() { int h, m, delay; // 输入预计时间和延误分钟 std::cin >> h >> m >> delay; // 计算总持续时间 auto total = hours(h) + minutes(m) + minutes(delay); auto total_mins = duration_cast<minutes>(total); // 计算当天的总分钟数 total_mins = total_mins % (24h * 60); // 分解小时和分钟 int res_h = total_mins.count() / 60; int res_m = total_mins.count() % 60; // 输出结果,补零 std::cout << (res_h < 10 ? "0" : "") << res_h << ":" << (res_m < 10 ? "0" : "") << res_m << std::endl; return 0; } 不过,这里需要注意输入的小时和分钟是否合法,比如小时是否在0-23之间,分钟是否在0-59之间。但题目可能假设输入是合法的,所以不需要处理。 另外,输出需要补零,比如1小时5分应该显示为01:05,而不是1:5。所以在输出时,使用条件判断补零。 另外,在C++14中,可以使用24h这样的字面量,所以24h就是24小时的duration。而minutes(24*60)等同于24h,对吗? 是的,因为24小时等于1440分钟,所以minutes(1440)等同于24h。因此,total_mins % 24h是可行的,因为duration的类型会自动转换? 或者,可能需要统一duration的类型。比如,如果total_mins的类型是minutes,而24h的类型是hours,那么需要转换。 或者,正确的做法是: auto one_day = 24h; auto one_day_in_mins = duration_cast<minutes>(one_day); // 1440分钟 然后,total_mins = total_mins % one_day_in_mins; 或者,直接用字面量: total_mins = total_mins % 1440min; // C++14的分钟字面量 但需要包含相应的命名空间: using namespace std::chrono_literals; 所以,代码可能需要调整。 或者,直接使用数值计算: total_mins = total_mins.count() % 1440; 但这可能失去duration的类型安全。 所以,正确的做法是保持duration类型,使用取模操作符,其中模数也是minutes类型。 例如: auto total_mins = duration_cast<minutes>(total); auto remainder = total_mins % 1440min; 但需要确保模数是minutes类型。在C++14中,可以使用字面量: using namespace std::chrono_literals; auto remainder = total_mins % 1440min; 这样,代码更清晰。 综上,整个代码的大致结构应该是这样的。另外,需要处理输入输出,确保格式正确。 另外,用户提到使用C++实现,可能需要处理输入输出中的时间格式,比如输入为三个整数:小时、分钟、延误分钟,输出为HH:MM格式。 测试用例: 比如,预计时间14:30,延误30分钟,结果15:00。 另一个例子,预计23:45,延误120分钟,结果(23*60 +45 +120) = 1425 +120=1545分钟。1545%1440=105分钟 → 1:45 → 01:45. 所以代码应该正确处理这种情况。 综上,使用chrono库的duration来处理时间的加减,然后取模得到当天的实际时间,再格式化为HH:MM。</think>要计算列车实际到站时间,可以通过以下步骤实现: ### 解决方案代码 ```cpp #include <iostream> #include <chrono> #include <iomanip> using namespace std::chrono; using namespace std::chrono_literals; int main() { int expected_h, expected_m, delay_min; std::cin >> expected_h >> expected_m >> delay_min; // 构建预计时间和延误时间 auto expected_duration = hours(expected_h) + minutes(expected_m); auto delay_duration = minutes(delay_min); // 计算总持续时间并取模24小时 auto total_duration = expected_duration + delay_duration; auto total_mins = duration_cast<minutes>(total_duration) % 1440min; // 输出格式化为HH:MM std::cout << std::setw(2) << std::setfill('0') << total_mins.count() / 60 << ":" << std::setw(2) << std::setfill('0') << total_mins.count() % 60 << std::endl; return 0; } ``` ### 实现步骤解析 1. **输入处理**:读取预计到达时间的小时(`expected_h`)、分钟(`expected_m`)和延误分钟数(`delay_min`) 2. **时间转换**:将输入值转换为`std::chrono::duration`类型的时间段 - `hours(expected_h)`创建小时时间段 - `minutes(expected_m)`创建分钟时间段 3. **时间计算**: ```cpp auto total_duration = expected_duration + delay_duration; ``` 4. **24小时制处理**:通过取模运算保证时间在24小时内 ```cpp auto total_mins = duration_cast<minutes>(total_duration) % 1440min; ``` 5. **结果格式化**:使用`std::setw`和`std::setfill`控制输出格式为`HH:MM` ### 关键点说明 - **持续时间计算**:`std::chrono::duration`可以直接进行加减运算,自动处理单位转换[^2] - **类型安全**:使用`duration_cast`确保单位统一,避免隐式转换错误[^3] - **24小时制处理**:`% 1440min`等效于对总分钟数取模24小时[^1] - **格式化输出**:`std::setw(2)`与`std::setfill('0')`配合实现补零效果 例如输入: ``` 23 45 120 ``` 将输出: ``` 01:45 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值