当前位置: 首页 > 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 天计数,效率更高。

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


http://www.mrgr.cn/news/17693.html

相关文章:

  • CSS3 2D 转换
  • 不小心删除的照片怎么找回?三种方法恢复照片,千万别错过!
  • unity游戏开发——标记物体 一目了然
  • 数据结构与算法——二叉树(java)
  • 安装 Let‘s Encrypt certbot 生成多个域名免费 https 证书实录(linux pip 方式)
  • 97.SAP MII功能详解(11)Workbench-Transaction Logic(Assignment和Condition)
  • NFV架构
  • 20240902软考架构-------软考96-100答案解析
  • 【awk 】找到文件中数值最大的那一行,并输出该行的行号和内容
  • 数据库操作与集成:使用Python与SQLite、MySQL、PostgreSQL等数据库
  • 一步到位的任务栏优化方案,TranslucentTB让你秒变桌面达人!
  • NASA数据集:ASTER全球数字海拔模型(GTEM)V003
  • uniapp二维码生成
  • IEEE PDF eXpress 报错解决 Error in converting file + font not embedded
  • 【论文阅读】语义通信安全研究综述(2024)
  • 【安卓面试】
  • 数据结构之队列
  • 2024年Linux内核社区关于large folio和mthp的关键进展
  • 前端面试:title与h1的区别、b与strong的区别、i与em的区别?
  • 嵌入式Linux C应用编程指南-高级I/O(速记版)