0%

LeetCode算法题之日期间隔天数

一道来自LeetCode的算法题。

难度:简单

来源https://leetcode-cn.com/problems/number-of-days-between-two-dates/

题目:请你编写一个程序来计算两个日期之间隔了多少天。日期以字符串形式给出,格式为 YYYY-MM-DD。(注:给定的日期是 1971 年到 2100 年之间的有效日期)

待实现模板

typescript

1
2
3
function daysBetweenDates(date1: string, date2: string): number {

};

python

1
2
3
4
5
6
7
class Solution(object):
def daysBetweenDates(self, date1, date2):
"""
:type date1: str
:type date2: str
:rtype: int
"""

分析&示例

示例1:

1
2
输入:date1 = "2019-06-29", date2 = "2019-06-30"
输出:1

示例2:

1
2
输入:date1 = "2020-01-15", date2 = "2019-12-31"
输出:15

分析:

计算天数间隔,我们可以以给定的最小日期1971.1.1为基准,分别计算给定日期经过了多少天,这样两者相减的绝对值就是间隔天数了。

关键的部分在于如何计算出从1971.1.1到给定日期经过了多少天,一种方法是从给定日期,一天一天递减,直到1971.1.1,但这样比较简单粗暴,我们可以找到一些规律来节约我们的计算:每个月的天数是固定的,或者说每年的天数是固定的,除了闰年2月多一天,有了这个规律,我们就可以直接递减年份来计算,而不必一天一天递减。

注:闰年指能被4整除但又不能被100整除的年份,除了能被400整除的世纪闰年。

实现(TypeScript)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function daysBetweenDates(date1: string, date2: string): number {
let d1 = getDays(date1);
let d2 = getDays(date2);
return Math.abs(d1 - d2);
};

function getDays(str: string) {
let arr = str.split('-');
let year = parseInt(arr[0]);
let month = parseInt(arr[1]);
let day = parseInt(arr[2]);
let months = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 365
const startY = 1971,
startM = 1;
// 日
let allDays = day;
// 月
if(month > 2 && isLeapYear(year)){
allDays += 1;
}
for(let i = 1; i < month; i++){
allDays += months[i];
}
// 年
while(year > startY){
allDays += 365;
if(isLeapYear(--year)) {
allDays += 1;
}
}
return allDays;
}

function isLeapYear(year: number): boolean{
return (year % 4 === 0 && year % 100 != 0) || (year % 400 === 0);
}

实现(Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution(object):
def daysBetweenDates(self, date1, date2):
"""
:type date1: str
:type date2: str
:rtype: int
"""
return abs(self.getDays(date1) - self.getDays(date2));
def isLeapYear(self, year):
return (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0)

def getDays(self, date):
dataArr = date.split('-');
year = int(dataArr[0]);
month = int(dataArr[1]);
allDays = int(dataArr[2]); # 日
months = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if month > 2 and self.isLeapYear(year):
allDays += 1;
# 月
i = 1;
while month > i:
allDays += months[i]
i += 1;
# 年
while year > 1971:
year -= 1;
if self.isLeapYear(year):
allDays += 1;
allDays += 365;
return allDays;
谢谢你请我吃糖!