• LeetCode.1154-一年中的第几天(Day of the Year)


    这是小川的第410次更新,第442篇原创

    看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第261题(顺位题号是1154)。给定表示格式为YYYY-MM-DD的公历日期的字符串日期,返回该日期在年份中的编号。例如:

    输入:date ="2019-01-09"
    输出:9
    说明:给定日期是2019年的第9天。

    输入:date ="2019-02-10"
    输出:41

    输入:date ="2003-03-01"
    输出:60

    输入:date ="2004-03-01"
    输出:61

    注意

    • date.length = 10

    • date[4] == date[7] == '-',所有其他date[i]都是数字

    • 日期表示1900年1月1日至2019年12月31日之间的日历日期。

    第一种解法

    题目的意思是计算给的日期在年份中的天数,年份分平年、闰年,月份分大月、小月,直接对日期字符串进行截取,转为对应的年月日数字。针对年份的处理,如果是闰年,则2月有29天,针对月份的处理,判断月份,然后累加对应的天数即可。

    public int dayOfYear(String date) {
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8, 10));
        switch (month) {
            case 12:
                day += 30;
            case 11:
                day += 31;
            case 10:
                day += 30;
            case 9:
                day += 31;
            case 8:
                day += 31;
            case 7:
                day += 30;
            case 6:
                day += 31;
            case 5:
                day += 30;
            case 4:
                day += 31;
            case 3:
                day += 28;
                if (isLeapYear(year)) {
                    day++;
                }
            case 2:
                day += 31;
        }
        return day;
    }
    
    /**
     * 判断当前年份是否为闰年
     * @param year
     * @return
     */
    public boolean isLeapYear(int year) {
        // 普通闰年,能被4整除,但是后两位不以00结尾
        if (year%4 == 0 && year%100 != 0) {
            return true;
        }
        // 世纪闰年,后两位以00结尾,且能被400整除
        if (year%100 == 0 && year%400 == 0) {
            return true;
        }
        return false;
    }
    

    第二种解法

    针对第一种解法中的switch语句,我们可以用数组进行替代,可以减少代码量。以月份为索引,天数为value,使用循环来处理天数,至于闰年的判断则不变。

    public int dayOfYear2(String date) {
        int[] arr = {31,28,31,30,31,30,31,31,30,31,30,31};
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8, 10));
        for (int i=0; i<month-1; i++) {
            day += arr[i];
        }
        return isLeapYear(year) && month >= 3 ? day+1 : day;
    }
    
    /**
     * 判断当前年份是否为闰年
     * @param year
     * @return
     */
    public boolean isLeapYear(int year) {
        // 普通闰年,能被4整除,但是后两位不以00结尾
        if (year%4 == 0 && year%100 != 0) {
            return true;
        }
        // 世纪闰年,后两位以00结尾,且能被400整除
        if (year%100 == 0 && year%400 == 0) {
            return true;
        }
        return false;
    }
    

    第三种解法

    既然我们已经知道了每一个月有多少天,那么我们可以直接将依次累计的天数放入数组中,月份减1为数组索引。

    创建一个长度为13的数组,第一项为0,因为一月可以直接获取天数显示即可,第二项为31天,因为二月的天数需要加上一月的31天,依次往后计算,此数组中的月份累计天数以平年为基础。如果当前年份是闰年,并且月份大于2月,则需要在计算结果上多加一天。

    public int dayOfYear3(String date) {
        int[] arr = {0,31,59,90,120,151,181,212,243,273,304,334,365};
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8, 10));
        if (isLeapYear(year) && month >= 3) {
            return arr[month-1]+day+1;
        }
        return arr[month-1]+day;
    }
    
    /**
     * 判断当前年份是否为闰年
     * @param year
     * @return
     */
    public boolean isLeapYear(int year) {
        // 普通闰年,能被4整除,但是后两位不以00结尾
        if (year%4 == 0 && year%100 != 0) {
            return true;
        }
        // 世纪闰年,后两位以00结尾,且能被400整除
        if (year%100 == 0 && year%400 == 0) {
            return true;
        }
        return false;
    }
    

    小结

    算法专题目前已更新LeetCode算法题文章267+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    20.12.2 leetcode7
    20.12.1 leetcode34
    20.11.30 leetcode767
    20.11.29 leetcode976
    Codeforces632E 选择/小偷与商店 背包DP
    魔法少女 DP NG放的水
    逆反的01串 模拟 NG放的水
    最大数maxnumber bzoj1012 JSOI2008 单调队列
    组合数问题 vijos2006 NOIP2016 D2T1 杨辉三角 排列组合 前缀和
    信息传递 vijos1979 NOIP2015D1T2 强连通分量 tarjan模版题
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11561361.html
Copyright © 2020-2023  润新知