[Java/LeetCode]算法练习:转变日期格式(1507/simple)

2023-06-25,,

1 题目描述

题目来源: https://leetcode-cn.com/problems/reformat-date

给你一个字符串 date ,它的格式为 Day Month Year ,其中:

Day 是集合 {"1st", "2nd", "3rd", "4th", ..., "30th", "31st"} 中的一个元素。
Month 是集合 {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} 中的一个元素。
Year 的范围在 ​[1900, 2100] 之间。

请你将字符串转变为 YYYY-MM-DD 的格式,其中:

YYYY 表示 4 位的年份。
MM 表示 2 位的月份。
DD 表示 2 位的天数。

示例 1:

输入:date = "20th Oct 2052"
输出:"2052-10-20"
示例 2:
输入:date = "6th Jun 1933"
输出:"1933-06-06"
示例 3:
输入:date = "26th May 1960"
输出:"1960-05-26"

提示:

给定日期保证是合法的,所以不需要处理异常输入。

通过次数11,760提交次数19,952

2 解题思路与代码

2.1 原始解决方法

2.1.1 思路(略)

2.1.2 源码(Java)

class Solution {
public String reformatDate(String date) {
Map<String, String> monthMap = new HashMap<>();
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"); String [] dateArray = date.split(" ");
StringBuilder resultStrBuilder = new StringBuilder();
resultStrBuilder.append(dateArray[2]+"-");//year
resultStrBuilder.append(monthMap.get(dateArray[1])+"-");//month
resultStrBuilder.append(String.format("%02d", Integer.valueOf(dateArray[0].substring(0, dateArray[0].length()-2))));//day
return resultStrBuilder.toString();
}
}

2.2 官方解法

思路

\[思路与算法
\]
\[首先,我们可以按照空格把字符串分割成三部分,分别取出日、月、年。对于他们分别做这样的事情:
\]
\[日:去掉结尾的两位英文字母,如果数字只有一位再补上前导零
\]
\[月:使用字典映射的方式把月份的英文缩写转换成对应的数字
\]
\[年:不用变化
\]
\[最终组织成「年-月-日」的形式即可。
\]

代码如下。

源码(Java)

class Solution {
public String reformatDate(String date) {
String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
Map<String, Integer> s2month = new HashMap<String, Integer>();
for (int i = 1; i <= 12; i++) {//代码风格更不错一点
s2month.put(months[i - 1], i);
}
String[] array = date.split(" ");
int year = Integer.parseInt(array[2]);
int month = s2month.get(array[1]);
int day = Integer.parseInt(array[0].substring(0, array[0].length() - 2));// Integer.parseInt
return String.format("%d-%02d-%02d", year, month, day);//String.format("%d-%02d-%02d", ...) 格式化更彻底/更简约,省掉了 StringBuilder
}
}

Y 相关知识

HashMap/Hashtable *

此数据结构的【查询性能极佳】、【适用于k-v查询】: O(1)
本算法中,用于查询 月份(key) 的阿拉伯数字(value)

Java的格式化API *

格式化输出类:
NumberFormat
DecimalFormat
Dateformat
String.format 日期类:

Java的String类API

String
substring
indexOf
charAt
length()
... StringBuilder StringBuffer

X 参考文献

1507.转变日期格式 - LeetCode

[Java/LeetCode]算法练习:转变日期格式(1507/simple)的相关教程结束。

《[Java/LeetCode]算法练习:转变日期格式(1507/simple).doc》

下载本文的Word格式文档,以方便收藏与打印。