我是靠谱客的博主 紧张御姐,最近开发中收集的这篇文章主要介绍【算法零基础100讲题解】第六讲 日期算法——基于Python语言零、写在前面一、基础知识二、题目解析三、写在后面,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

零、写在前面


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


在这里插入图片描述


目录

  • 零、写在前面
  • 一、基础知识
  • 二、题目解析
    • 1.一周中的第几天(1185)
    • 2.一年中的第几天(1154)
    • 3.日期之间隔几天(1360)
  • 三、写在后面

一、基础知识

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 日为止。

三、写在后面

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

最后

以上就是紧张御姐为你收集整理的【算法零基础100讲题解】第六讲 日期算法——基于Python语言零、写在前面一、基础知识二、题目解析三、写在后面的全部内容,希望文章能够帮你解决【算法零基础100讲题解】第六讲 日期算法——基于Python语言零、写在前面一、基础知识二、题目解析三、写在后面所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部