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

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 参考文献

posted @ 2022-04-24 20:08  千千寰宇  阅读(99)  评论(0编辑  收藏  举报