【日更刷题】1507. 转变日期格式

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

一、题目描述:

1507. 转变日期格式 - 力扣(LeetCode)

给你一个字符串 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"

提示:

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

二、思路分析:

istringstream分词功能不要太好用,根据题意都是按顺序的那种,所以直接分词到 day month year

然后分别对这3个进行字符处理

  1. day:我们看字符第二位是否为数字,用到isdigit(str)函数,然后根据日期大小分为两种情况, 用substr(pos1,pos2)函数截取字符char

    1. <10,比如“9th”,“09”是目标,截取1位,用 '0' + day.substr(0, 1)
    2. 10,比如“10th”,“10”是目标,截取2位,用 day.substr(0, 2)

  2. month:我用的是map<string, int> 来进行月份的对应,这里也要根据月份大小分两种情况

    1. <10,因为返回的都是int类型,所以调用to_string(int a)函数转换为string,并加上 “0”
    2. 10,直接调用to_string(int a)就行

  3. year:不用做处理

结果 = year + "-" + month + "-" + day

三、AC 代码:

class Solution {
public:
    string reformatDate(string date) {
        map<string, int> month_mp = {
            {"Jan",1}, 
            {"Feb",2}, 
            {"Mar",3}, 
            {"Apr",4}, 
            {"May",5}, 
            {"Jun",6},
            {"Jul",7}, 
            {"Aug",8}, 
            {"Sep",9}, 
            {"Oct",10}, 
            {"Nov",11}, 
            {"Dec",12} };
        istringstream d(date);
        string day, month, year;
        d >> day >> month >> year;
        day = isdigit(day[1]) ? day.substr(0, 2) : '0' + day.substr(0, 1); 
        month = month_mp[month] < 10 ? "0" + to_string(month_mp[month]) : to_string(month_mp[month]);
        return year + "-" + month + "-" + day;       
        }
};

四、总结:

主要还就是要建立对应的字典,然后注意优化方案。

五、分析:

转变日期格式 - 转变日期格式 - 力扣(LeetCode)