這是小川的第410次更新寄啼,第442篇原創(chuàng)
看題和準(zhǔn)備
今天介紹的是LeetCode算法題中Easy級(jí)別的第261題(順位題號(hào)是1154)。給定表示格式為YYYY-MM-DD
的公歷日期的字符串日期姥饰,返回該日期在年份中的編號(hào)缤苫。例如:
輸入:date ="2019-01-09"
輸出:9
說明:給定日期是2019年的第9天瓷们。
輸入:date ="2019-02-10"
輸出:41
輸入:date ="2003-03-01"
輸出:60
輸入:date ="2004-03-01"
輸出:61
注意:
date.length
= 10date[4] == date[7] == '-',所有其他
date[i]
都是數(shù)字日期表示1900年1月1日至2019年12月31日之間的日歷日期簿寂。
第一種解法
題目的意思是計(jì)算給的日期在年份中的天數(shù),年份分平年宿亡、閏年常遂,月份分大月、小月挽荠,直接對(duì)日期字符串進(jìn)行截取克胳,轉(zhuǎn)為對(duì)應(yīng)的年月日數(shù)字。針對(duì)年份的處理圈匆,如果是閏年漠另,則2月有29天,針對(duì)月份的處理臭脓,判斷月份酗钞,然后累加對(duì)應(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;
}
/**
* 判斷當(dāng)前年份是否為閏年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通閏年,能被4整除砚作,但是后兩位不以00結(jié)尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世紀(jì)閏年窘奏,后兩位以00結(jié)尾,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}
第二種解法
針對(duì)第一種解法中的switch
語句葫录,我們可以用數(shù)組進(jìn)行替代着裹,可以減少代碼量。以月份為索引米同,天數(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;
}
/**
* 判斷當(dāng)前年份是否為閏年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通閏年少孝,能被4整除,但是后兩位不以00結(jié)尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世紀(jì)閏年熬苍,后兩位以00結(jié)尾稍走,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}
第三種解法
既然我們已經(jīng)知道了每一個(gè)月有多少天,那么我們可以直接將依次累計(jì)的天數(shù)放入數(shù)組中柴底,月份減1為數(shù)組索引婿脸。
創(chuàng)建一個(gè)長(zhǎng)度為13的數(shù)組,第一項(xiàng)為0柄驻,因?yàn)橐辉驴梢灾苯荧@取天數(shù)顯示即可狐树,第二項(xiàng)為31天,因?yàn)槎碌奶鞌?shù)需要加上一月的31天鸿脓,依次往后計(jì)算抑钟,此數(shù)組中的月份累計(jì)天數(shù)以平年為基礎(chǔ)。如果當(dāng)前年份是閏年答憔,并且月份大于2月味赃,則需要在計(jì)算結(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;
}
/**
* 判斷當(dāng)前年份是否為閏年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通閏年虐拓,能被4整除心俗,但是后兩位不以00結(jié)尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世紀(jì)閏年,后兩位以00結(jié)尾蓉驹,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}
小結(jié)
算法專題目前已更新LeetCode算法題文章267+篇城榛,公眾號(hào)對(duì)話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】、【算法】态兴、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞狠持,獲取系列文章合集。
以上就是全部?jī)?nèi)容瞻润,如果大家有什么好的解法思路喘垂、建議或者其他問題甜刻,可以下方留言交流,點(diǎn)贊正勒、留言得院、轉(zhuǎn)發(fā)就是對(duì)我最大的回報(bào)和支持!