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

這是小川的第410次更新,第442篇原創(chuàng)

看題和準備

今天介紹的是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]都是數(shù)字

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

第一種解法

題目的意思是計算給的日期在年份中的天數(shù),年份分平年、閏年,月份分大月、小月,直接對日期字符串進行截取,轉(zhuǎn)為對應(yīng)的年月日數(shù)字。針對年份的處理,如果是閏年,則2月有29天,針對月份的處理,判斷月份,然后累加對應(yīng)的天數(shù)即可。

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結(jié)尾
    if (year%4 == 0 && year%100 != 0) {
        return true;
    }
    // 世紀閏年,后兩位以00結(jié)尾,且能被400整除
    if (year%100 == 0 && year%400 == 0) {
        return true;
    }
    return false;
}


第二種解法

針對第一種解法中的switch語句,我們可以用數(shù)組進行替代,可以減少代碼量。以月份為索引,天數(shù)為value,使用循環(huán)來處理天數(shù),至于閏年的判斷則不變。

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結(jié)尾
    if (year%4 == 0 && year%100 != 0) {
        return true;
    }
    // 世紀閏年,后兩位以00結(jié)尾,且能被400整除
    if (year%100 == 0 && year%400 == 0) {
        return true;
    }
    return false;
}


第三種解法

既然我們已經(jīng)知道了每一個月有多少天,那么我們可以直接將依次累計的天數(shù)放入數(shù)組中,月份減1為數(shù)組索引。

創(chuàng)建一個長度為13的數(shù)組,第一項為0,因為一月可以直接獲取天數(shù)顯示即可,第二項為31天,因為二月的天數(shù)需要加上一月的31天,依次往后計算,此數(shù)組中的月份累計天數(shù)以平年為基礎(chǔ)。如果當前年份是閏年,并且月份大于2月,則需要在計算結(jié)果上多加一天。

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結(jié)尾
    if (year%4 == 0 && year%100 != 0) {
        return true;
    }
    // 世紀閏年,后兩位以00結(jié)尾,且能被400整除
    if (year%100 == 0 && year%400 == 0) {
        return true;
    }
    return false;
}


小結(jié)

算法專題目前已更新LeetCode算法題文章267+篇,公眾號對話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】、【算法】、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集。

以上就是全部內(nèi)容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉(zhuǎn)發(fā)就是對我最大的回報和支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容