leetcode
leetcode 1101 ~ 1150
转变日期格式

转变日期格式

难度:

标签:

题目描述

代码结果

运行时间: 22 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 使用空格分割输入字符串,得到日、月、年三个部分。
 * 2. 将日的后缀(如'nd', 'st', 'rd', 'th')去掉,并将其转换为两位数的字符串格式。
 * 3. 使用一个数组来映射月份的英文名称到数字形式。
 * 4. 使用Java Stream API实现日期格式的转换。
 */

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class Solution {
    private static final Map<String, String> monthMap = new HashMap<>();
    static {
        monthMap.put("Jan", "01");
        monthMap.put("Feb", "02");
        monthMap.put("Mar", "03");
        monthMap.put("Apr", "04");
        monthMap.put("May", "05");
        monthMap.put("Jun", "06");
        monthMap.put("Jul", "07");
        monthMap.put("Aug", "08");
        monthMap.put("Sep", "09");
        monthMap.put("Oct", "10");
        monthMap.put("Nov", "11");
        monthMap.put("Dec", "12");
    }

    public String reformatDate(String date) {
        String[] parts = date.split(" ");
        String day = parts[0].replaceAll("\D", "");
        if (day.length() == 1) day = "0" + day;
        String month = monthMap.get(parts[1]);
        String year = parts[2];
        return String.join("-", Arrays.asList(year, month, day));
    }
}

解释

方法:

题解的思路是将输入的日期字符串按照空格分割为三个部分:天、月、年。首先,通过创建一个字典来映射每个月的缩写到其对应的两位数月份字符串。接着,对天和年进行字符串处理:年直接取后四位,天则去掉最后两个字符(如'st', 'nd', 'rd', 'th'),并在需要时在前面添加0以确保天总是两位数。最后,按照'YYYY-MM-DD'的格式将处理后的年、月、日组合成最终的字符串。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
如何处理日期中的天数部分,特别是不同长度的后缀(如'st', 'nd', 'rd', 'th')对天数字符串长度的影响?
在解决方案中,日期的天数部分的后缀('st', 'nd', 'rd', 'th')被统一处理。通过观察可以发现这些后缀长度固定为两个字符。因此,无论天数是一位数还是两位数,都可以通过简单地移除字符串最后两个字符来去除这些后缀。接着,检查处理后的天数字符串是否只有一位数字,如果是,则在其前面补充一个'0'以确保天总是以两位数表示。这样的处理适应了所有可能的后缀长度,且确保了天数格式的正确性。
🦆
在处理月份为'Sep'或'Apr'等情况时,月份映射字典如何确保不同长度的月份缩写都能正确转换为两位数月份?
在创建月份映射字典时,每个月份的缩写(如'Sep', 'Apr'等)都映射到一个固定的两位数字符串表示。例如,'Jan' 映射到 '01','Feb' 映射到 '02',依此类推。这样无论月份缩写的长度如何,映射后都会转换为标准的两位数月份格式。字典的设计保证了从任何有效的三字符月份缩写到其对应的两位数字符串的直接映射。
🦆
题解中没有明确提到如何处理日期字符串中可能存在的前导或尾随空格,这些空格会影响`split`方法的结果吗?
在Python中,字符串的`split()`方法在不带参数时默认以空白字符(包括空格、换行等)作为分隔符,并且会自动去除字符串开头和结尾的空白字符。因此,即使输入的日期字符串前后有额外的空格,使用`split()`方法仍然能正确地分割字符串为天、月、年三部分,不会影响最终结果。
🦆
如果输入的日期字符串格式错误(例如,月份拼写错误或年份位数不正确),这个解决方案如何处理此类异常?
当前的解决方案没有提供处理输入错误的机制。如果月份拼写错误,例如使用了不存在的缩写,那么尝试从`month_map`字典中获取对应值时将会导致KeyError异常。如果年份位数不正确,如不是四位数字,`year[-4:]`的操作虽然不会产生错误,但可能导致逻辑上的错误结果。为了提高程序的健壮性,可以在实现中添加异常处理逻辑,比如使用try-except块来捕获并处理这些潜在的输入错误,确保输入符合预期格式。

相关问题