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

  • 相关阅读:
    Linux下的lds链接脚本简介
    Fedora下载地址
    SkyEye的使用
    shell变量详解
    Linux shell 脚本攻略之正则表达式入门
    Linux shell 脚本攻略之统计文件的行数、单词数和字符数
    Linux shell 脚本攻略之创建不可修改文件
    Linux shell 脚本攻略之生成任意大小的文件
    Linux shell 脚本攻略之批量重命名
    Linux shell 脚本攻略之文件查找与文件列表
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/16187363.html
Copyright © 2020-2023  润新知