【算法零基础100讲题解】第六讲 日期算法——基于Python语言

零、写在前面


💗博主简介:大家好,我是MUSE,一个正在成长的Python博主小白!
😏博客主页倒霉沙拉🥗
🔥 欢迎关注🙏点赞👍评论✉️收藏💝
💻系列介绍本系列采用Python语言解决算法零基础100讲题目,相关文章可以关注专栏!


在这里插入图片描述


一、基础知识

1.闰年定义

在这里插入图片描述

2.闰年计算

这里是引用

3.代码实现

def isLeapYear(self,year):
		if year%400==0:
			return True
		if year%4==0 and year%100!=0:
			return False

这个代码也是在之后的题目中判断闰年的重要方法。

二、题目解析

1.一周中的第几天(1185)

在这里插入图片描述

class Solution:
	def dayOfTheWeek(self,day:int,month:int,year:int)->str:
		res=["Friday","Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"]
		days=-1
		for y in range(1971,year):
			if self.isLeapYear(y):
				days+=366
			else:
				days+=365
		
		for m in range(1,m):
			if m==2:
				if self.isLeapYear(year):
					days+=29
				else:
					days+=28
			elif m in [1,3,5,7,8,10,12]:
				days+=31
			else:
				days+=30
		
		days+=day
		
		ans=days%7
		return res[ans]
	
	def isLeapYear(self,year):
		if year%400==0:
			return True
		if year%4==0 and year%100!=0:
			return False

解题思路:

1)我采用了一个最简单直接的思路去求解这道题目;
2)因为题目中规定了年份的范围是[1971,2100],那么我们通过对给定的日期换算成天数对7求余,但是因为1971年1月1日是星期五,我们需要对给定的星期列表做一个改变,代码如上;

3)之后我们对年月日遍历添加,将求出的和对7求余,返回即可。

2.一年中的第几天(1154)

在这里插入图片描述

class Solution:
	def dayOfYear(self,date:str)->int:
		year=int(date[0:4])
		month=int(date[5:7])
		day=int(date[8:])
		
		days=0
		if self.isLeapYear(year):
			for m in range(1,month):
				if m==2:
					days+=29
				elif m in [1,3,5,7,8,10,12]:
					days+=31
				else:
					days+=30
		else:
			for m in range(1,month):
				if m==2:
					days+=28
				elif m in [1,3,5,7,8,10,12]:
					days+=31
				else:
					days+=30
		days+=day
		return days

	def isLeapYear(self,year):
		if year%400==0:
			return True
		if year%4==0 and year%100!=0:
			return False

解题思路:

1)基本思路与上题类似;
2)利用字符串遍历对应位置的值,依次遍历求和,需要注意闰年对2月份天数的影响,和上题一样,大家可以对比学习一下。

3.日期之间隔几天(1360)

在这里插入图片描述

class Solution:
    def leap_year(self, year):
        return (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0)

    def date_to_int(self, year, month, day):
        ans = 0
        month_length = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]
        while year != 1971 or month != 1 or day != 1:
            ans += 1
            day -= 1
            if day == 0:
                month -= 1
                day = month_length[month]
                if month == 2 and self.leap_year(year):
                    day += 1
            if month == 0:
                year -= 1
                month = 12
        return ans
            
    def daysBetweenDates(self, date1: str, date2: str) -> int:
        date1 = [int(i) for i in date1.split('-')]
        date2 = [int(i) for i in date2.split('-')]
        return abs(self.date_to_int(*date1) - self.date_to_int(*date2))

解题思路:

由于题目中的日期不会早于 1971 年,我们可以将两个日期转化为距离 1971 年 1 月 1日的天数。这一转化过程可以直接暴力求解:从当前日期开始,一天一天递减,直到 1971 年 1 月 1 日为止。

三、写在后面

今天的题目是关于闰年的判断利用在日期计算中的,大家可能会感觉代码比较长,因为我采用的是最简单的思路,大家一看就能懂得,除此之外呢,看起来代码很长,但其实代码的结构与思路还是有相似的地方的,所以也没有那么难!
对你有帮助的话,点个赞再走吧,你的反馈将是我最大的动力!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUSE_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值