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

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

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

今日算法第 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.kler.cn/a/287045.html

相关文章:

  • YOLOv9改进,YOLOv9检测头融合RFAConv卷积,适合目标检测、分割任务
  • 可视化-numpy实现线性回归和梯度下降法
  • PIC单片机设置bootloader程序和app程序地址方法
  • 【Python】循环语句
  • ubuntu系统文件查找、关键字搜索
  • Scala语言的循环实现
  • easyExcel 单元格合并
  • C++开发基础之宏定义:入门、中级、高级用法示例解析
  • 计算机毕业设计选题推荐-体育馆场地预约系统-Java/Python项目实战
  • OpenHarmony开发:应用分层架构设计
  • 汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动
  • 【Python机器学习】NLP词中的数学——齐普夫定律
  • vue点击事件
  • Mac怎么安装谷歌浏览器
  • 算法-汇总区间(228)
  • FFmpeg源码:append_packet_chunked、av_get_packet函数分析
  • Android自定义View实现彩虹进度条(带动画)
  • 完美解决Jenkins重启后自动杀掉衍生进程(子进程)问题
  • ​哈哈题库​邀请书
  • [Day 68] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 如何在 CentOS 6 上安装 Nagios
  • 噪音消除模块调研
  • selenium(一)基于java、元素定位
  • 697.数组的度
  • 超级会员卡积分收银系统源码,一站式解决方案,可以收银的小程序 带完整的安装代码包以及搭建部署教程
  • 探讨Facebook开户广告起充多少:全球标准与优势解析