今日算法:蓝桥杯基础题之“星期一”

2024-09-02 13:12

本文主要是介绍今日算法:蓝桥杯基础题之“星期一”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!

今日算法第 5 题,你知道 20 世纪有多少个"星期一"吗?一起看看吧。

问题描述

整个 20 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日之间),一共有多少个星期一?请使用 JavaScript 编写一个函数来计算这个数字。

解题思路(一)

要解决这个问题,我们需要遍历整个 20 世纪的所有日期,并检查每个日期是否是星期一。我们可以使用 JavaScript 的 Date 对象来实现这一点。具体步骤如下:

  1. 创建一个 Date 对象,表示 1901 年 1 月 1 日。
  2. 使用一个循环遍历从 1901 年 1 月 1 日到 2000 年 12 月 31 日的所有日期。
  3. 在每次循环中,检查当前日期是否是星期一(即 getDay() 方法返回 1)。
function countMondays(startYear, endYear) {let count = 0;const startDate = new Date(startYear, 0, 1); // 1月1日,注意月份是从0开始的const endDate = new Date(endYear + 1, 0, 1); // 下个世纪的开始,不包含在内let currentDate = new Date(startDate);while (currentDate < endDate) {if (currentDate.getDay() === 1) {// 0是星期日,1是星期一count++;}currentDate.setDate(currentDate.getDate() + 1); // 移动到下一天}return count;
}// 计算20世纪(1901~2000)的星期一数量
const mondays = countMondays(1901, 2000);
console.log(mondays); // 输出结果

解题思路(二)

第一种解题思路需要遍历至少 365 * 100 = 36500 次,效率较低。我们可以先计算出第一天是否是星期一,如果不是,找到临近的下一个星期一,每隔 7 天加一次数据,这样可以让遍历次数减少 6/7= 85%以上。

function countMondays(startYear, endYear) {// 定义开始和结束日期const startDate = new Date(startYear, 0, 1); // 1月1日,注意月份是从0开始的const endDate = new Date(endYear + 1, 0, 1); // 下个世纪的开始,不包含在内// 计算起始日期是星期几(getDay() 返回0-6,其中0代码星期日,1代表星期一)let weekDayOfStart = startDate.getDay();// 如果起始日期不是星期一,则找到下一个星期一if (weekDayOfStart !== 1) {startDate.setDate(startDate.getDate() + ((1 - weekDayOfStart + 7) % 7));}// 初始化计数器let count = 0;// 遍历从下一个星期一开始到结束日期的所有日期while (startDate < endDate) {count++;startDate.setDate(startDate.getDate() + 7); // 每次增加7天,即一周}return count;
}const mondays = countMondays(1901, 2000);
console.log(mondays);

总结

通过上述两种方法,我们可以计算出 20 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日之间)的星期一数量是 5217,你算对了吗?第一种方法直接遍历所有日期,效率较低;第二种方法通过找到起始日期的下一个星期一,并每隔 7 天计数,效率更高。

好了,分享结束,谢谢点赞,下期再见。

这篇关于今日算法:蓝桥杯基础题之“星期一”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130054

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.