当前位置: 首页 > news >正文

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

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

今日算法第 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 天计数,效率更高。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Nest 学习笔记】AOP切片编程
  • python执行安装包文件时报错
  • 微信卸载后重新安装聊天记录怎么恢复?4招轻松找回微信数据
  • 最大交换
  • 哈希基础概念即使用(C++)
  • 华为云征文 | 华为云Flexus云服务器X实例全面使用操作指南
  • Hadoop环境搭建
  • 解析淘宝商品详情API返回值中的特殊属性
  • Python和Java及MATLAB和CUDA显微镜导图
  • Vue转React踩坑记录——useEffect组件卸载时使用useState定义的值返回undefined
  • 小琳Python课堂:Python性能测试利器:`timeit`和`memory_profiler`模块的使用与实践
  • Windows 10和11中检查打印文档历史记录的几种方法
  • 职场人,请珍惜每一次发言汇报机会!攻略如下
  • python操作kafka
  • k8s-pod 实战四 什么是 Kubernetes Pod?如何在生产环境中使用它?(学习专场,实战就看这一篇就够了)
  • es6要点
  • Java 网络编程(2):UDP 的使用
  • Laravel Telescope:优雅的应用调试工具
  • MYSQL 的 IF 函数
  • Mysql优化
  • PHP 的 SAPI 是个什么东西
  • ReactNative开发常用的三方模块
  • supervisor 永不挂掉的进程 安装以及使用
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue总结
  • webpack4 一点通
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 程序员该如何有效的找工作?
  • 关于使用markdown的方法(引自CSDN教程)
  • 聚类分析——Kmeans
  • 聊一聊前端的监控
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 盘点那些不知名却常用的 Git 操作
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 深入 Nginx 之配置篇
  • 使用 Docker 部署 Spring Boot项目
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我的zsh配置, 2019最新方案
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 云大使推广中的常见热门问题
  • AI算硅基生命吗,为什么?
  • hi-nginx-1.3.4编译安装
  • # Apache SeaTunnel 究竟是什么?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ## 1.3.Git命令
  • #include
  • #laravel 通过手动安装依赖PHPExcel#
  • #window11设置系统变量#
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)