leetcode每天一题:【一周中的第几天】(简单)

239 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

给一个具体的日期,然后你要计算出它是属于一周的哪一天。

提供三个参数,day(天), month(月), year(年)。

返回值是以下值的一项。

['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

补充:给出的日期一定是在 1971 到 2100 年之间的有效日期。

思路分析

第一种方法

我们可以利用date实例有个方法,getDay方法。

这个方法是返回date实例处于一周的第几天,这刚好对应上题目的需求。

于是,我们只需要把返回值当作索引,去数组 ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 中到对应的值返回即可。

代码如下:

/**
 * @param {number} day
 * @param {number} month
 * @param {number} year
 * @return {string}
 */
var dayOfTheWeek = function (day, month, year) {
  const date = new Date(`${year}/${month}/${day}`)
  return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getDay()]
};

但是如果不能使用date对象的现成api,可否实现这个需求呢?

答案是肯定能的。

第二种方法

第二种方法有个前提条件,我们需要知道 '1970/12/31'是周四 。我们首先需要知道这个前提条件。

然后我们计算给定的日期距离1970/12/31是多少天,然后对它除以7(因为一周7天)取余,余数就是一周的第几天。

这里需要注意,因为年份有闰年和平年之分,这里需要判断当前年份是不是闰年,如果是需要对二月设置成29天,否则设置成28天。

闰年的判断:

  • 年份如果能被100整除,则能被400整除,就是闰年
  • 年份不能被100整数,则能被4整除,就是闰年
  • 不满足以上条件都是平年

然后我们就从1971年开始遍历,然后把每年的天数加起来,遍历到当前年的时候,只需要把当前的月份和天数加上就可。

最后把它除以7取余,就是一周的第几天。

代码如下:

/**
 * @param {number} day
 * @param {number} month
 * @param {number} year
 * @return {string}
 */
var dayOfTheWeek = function (day, month, year) {
  // '1970/12/31'是周四
  const weekArr = ['Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday']
  const isLeapYear = (y) => y % 100 === 0 ? y % 400 === 0 : y % 4 === 0
  let monthArr = [31, , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  let days = 0
  for (let y = 1971; y <= year; y++) {
    monthArr[1] = isLeapYear(y) ? 29 : 28
    if (y < year) {
      days = monthArr.reduce((acc, cur) => acc + cur, days)
    } else {
      days = monthArr.slice(0, month - 1).reduce((acc, cur) => acc + cur, days)
      days += day
    }
  }
  return weekArr[days % 7]
};