题目链接

时间转换

题目描述

给定一个12小时制的时间字符串(例如 08:03:45PM),请将其转换成24小时制的时间字符串(例如 20:03:45)。

特殊规则说明

  • 午夜 12:00:00AM 对应24小时制的 00:00:00
  • 中午 12:00:00PM 对应24小时制的 12:00:00

解题思路

这是一个简单的字符串处理和逻辑判断问题。核心在于正确处理小时部分的转换,分钟和秒钟部分保持不变。

我们可以将输入字符串 HH:MM:SSAMHH:MM:SSPM 分为三个部分来处理:

  1. 小时 HH
  2. 分钟和秒 MM:SS
  3. 上午/下午标识 AMPM

转换的逻辑可以根据标识符和小时数进行分类讨论:

  1. 处理 AM (上午)

    • 一般情况 (0111 AM):24小时制的小时数与12小时制相同。例如 08 AM 就是 08 点。
    • 特殊情况 (12 AM):午夜12点,在24小时制中是 00 点。
  2. 处理 PM (下午)

    • 一般情况 (0111 PM):24小时制的小时数需要在12小时制的基础上加12。例如 08 PM 就是 8 + 12 = 20 点。
    • 特殊情况 (12 PM):中午12点,在24小时制中仍然是 12 点,不需要加12。

算法步骤

  1. 读取输入的12小时制时间字符串。
  2. 提取出小时部分(前两个字符)、中间的分钟秒钟部分(第2到8个字符)以及AM/PM标识(最后两个字符)。
  3. 将小时字符串转换为整数。
  4. 根据AM/PM标识符和小时数进行判断:
    • 如果标识是 "AM" 且小时是 12,则将小时置为 0。
    • 如果标识是 "PM" 且小时不是 12,则将小时数加上 12。
  5. 将处理后的小时数格式化为两位数的字符串(不足两位前面补0)。
  6. 将格式化后的小时字符串与原有的分钟秒钟字符串拼接,得到最终的24小时制时间字符串。
  7. 输出结果。

代码

#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()

算法及复杂度

  • 算法:字符串处理、逻辑判断

  • 时间复杂度: 。因为输入字符串的长度是固定的,所有的操作(子串提取、转换、判断、拼接)都是常数时间。

  • 空间复杂度: 。我们只使用了常数个额外的变量来存储字符串的各个部分。