题目链接
题目描述
给定一个12小时制的时间字符串(例如 08:03:45PM
),请将其转换成24小时制的时间字符串(例如 20:03:45
)。
特殊规则说明:
- 午夜
12:00:00AM
对应24小时制的00:00:00
。 - 中午
12:00:00PM
对应24小时制的12:00:00
。
解题思路
这是一个简单的字符串处理和逻辑判断问题。核心在于正确处理小时部分的转换,分钟和秒钟部分保持不变。
我们可以将输入字符串 HH:MM:SSAM
或 HH:MM:SSPM
分为三个部分来处理:
- 小时
HH
- 分钟和秒
MM:SS
- 上午/下午标识
AM
或PM
转换的逻辑可以根据标识符和小时数进行分类讨论:
-
处理
AM
(上午):- 一般情况 (
01
到11
AM):24小时制的小时数与12小时制相同。例如08 AM
就是08
点。 - 特殊情况 (
12 AM
):午夜12点,在24小时制中是00
点。
- 一般情况 (
-
处理
PM
(下午):- 一般情况 (
01
到11
PM):24小时制的小时数需要在12小时制的基础上加12。例如08 PM
就是8 + 12 = 20
点。 - 特殊情况 (
12 PM
):中午12点,在24小时制中仍然是12
点,不需要加12。
- 一般情况 (
算法步骤
- 读取输入的12小时制时间字符串。
- 提取出小时部分(前两个字符)、中间的分钟秒钟部分(第2到8个字符)以及AM/PM标识(最后两个字符)。
- 将小时字符串转换为整数。
- 根据AM/PM标识符和小时数进行判断:
- 如果标识是 "AM" 且小时是 12,则将小时置为 0。
- 如果标识是 "PM" 且小时不是 12,则将小时数加上 12。
- 将处理后的小时数格式化为两位数的字符串(不足两位前面补0)。
- 将格式化后的小时字符串与原有的分钟秒钟字符串拼接,得到最终的24小时制时间字符串。
- 输出结果。
代码
#include <iostream>
#include <string>
#include <vector>
#include <iomanip> // For std::setw and std::setfill
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string time12h;
cin >> time12h;
int hh = stoi(time12h.substr(0, 2));
string mmss = time12h.substr(2, 6);
string ampm = time12h.substr(8, 2);
if (ampm == "AM") {
if (hh == 12) { // Midnight case
hh = 0;
}
} else { // PM case
if (hh != 12) { // Noon case is 12, others add 12
hh += 12;
}
}
// Using iostream manipulators for formatting
cout << setfill('0') << setw(2) << hh << mmss << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String time12h = sc.next();
String hhStr = time12h.substring(0, 2);
String mmss = time12h.substring(2, 8);
String ampm = time12h.substring(8, 10);
int hh = Integer.parseInt(hhStr);
if (ampm.equals("AM")) {
if (hh == 12) { // Midnight 12:00:00AM is 00:00:00
hh = 0;
}
} else { // PM
if (hh != 12) { // Afternoon/Evening, e.g., 01:00:00PM is 13:00:00
hh += 12;
}
// Noon 12:00:00PM is 12:00:00, no change
}
System.out.printf("%02d%s\n", hh, mmss);
}
}
import sys
def solve():
try:
time12h = sys.stdin.readline().strip()
if not time12h:
return
hh_str = time12h[0:2]
mmss = time12h[2:8]
ampm = time12h[8:10]
hh = int(hh_str)
if ampm == 'AM':
if hh == 12:
hh = 0
else: # PM
if hh != 12:
hh += 12
# Format hour to be two digits with leading zero if needed
hh_24_str = f"{hh:02d}"
print(hh_24_str + mmss)
except (IOError, ValueError):
return
solve()
算法及复杂度
-
算法:字符串处理、逻辑判断
-
时间复杂度:
。因为输入字符串的长度是固定的,所有的操作(子串提取、转换、判断、拼接)都是常数时间。
-
空间复杂度:
。我们只使用了常数个额外的变量来存储字符串的各个部分。