一道来自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]; 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;
|