返回介绍

solution / 1100-1199 / 1185.Day of the Week / README

发布于 2024-06-17 01:03:22 字数 4591 浏览 0 评论 0 收藏 0

1185. 一周中的第几天

English Version

题目描述

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:daymonth 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

 

示例 1:

输入:day = 31, month = 8, year = 2019
输出:"Saturday"

示例 2:

输入:day = 18, month = 7, year = 1999
输出:"Sunday"

示例 3:

输入:day = 15, month = 8, year = 1993
输出:"Sunday"

 

提示:

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

解法

方法一:蔡勒公式

我们可以使用蔡勒公式来计算星期几,蔡勒公式如下:

$$ w = (\left \lfloor \frac{c}{4} \right \rfloor - 2c + y + \left \lfloor \frac{y}{4} \right \rfloor + \left \lfloor \frac{13(m+1)}{5} \right \rfloor + d - 1) \bmod 7 $$

其中:

  • w: 星期(从 Sunday 开始)
  • c: 年份前两位
  • y: 年份后两位
  • m: 月(m 的取值范围是 3 至 14,即在蔡勒公式中,某年的 1、2 月要看作上一年的 13、14 月来计算,比如 2003 年 1 月 1 日要看作 2002 年的 13 月 1 日来计算)
  • d: 日
  • ⌊⌋: 向下取整
  • mod: 取余

时间复杂度 $O(1)$,空间复杂度 $O(1)$。

class Solution:
  def dayOfTheWeek(self, day: int, month: int, year: int) -> str:
    return datetime.date(year, month, day).strftime('%A')
import java.util.Calendar;

class Solution {
  private static final String[] WEEK
    = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

  public static String dayOfTheWeek(int day, int month, int year) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month - 1, day);
    return WEEK[calendar.get(Calendar.DAY_OF_WEEK) - 1];
  }
}
class Solution {
public:
  string dayOfTheWeek(int d, int m, int y) {
    if (m < 3) {
      m += 12;
      y -= 1;
    }
    int c = y / 100;
    y %= 100;
    int w = (c / 4 - 2 * c + y + y / 4 + 13 * (m + 1) / 5 + d - 1) % 7;
    vector<string> weeks = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    return weeks[(w + 7) % 7];
  }
};
func dayOfTheWeek(d int, m int, y int) string {
  if m < 3 {
    m += 12
    y -= 1
  }
  c := y / 100
  y %= 100
  w := (c/4 - 2*c + y + y/4 + 13*(m+1)/5 + d - 1) % 7
  weeks := []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
  return weeks[(w+7)%7]
}
function dayOfTheWeek(d: number, m: number, y: number): string {
  if (m < 3) {
    m += 12;
    y -= 1;
  }
  const c: number = (y / 100) | 0;
  y %= 100;
  const w = (((c / 4) | 0) - 2 * c + y + ((y / 4) | 0) + (((13 * (m + 1)) / 5) | 0) + d - 1) % 7;
  const weeks: string[] = [
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
  ];
  return weeks[(w + 7) % 7];
}

方法二

class Solution:
  def dayOfTheWeek(self, d: int, m: int, y: int) -> str:
    if m < 3:
      m += 12
      y -= 1
    c = y // 100
    y = y % 100
    w = (c // 4 - 2 * c + y + y // 4 + 13 * (m + 1) // 5 + d - 1) % 7
    return [
      "Sunday",
      "Monday",
      "Tuesday",
      "Wednesday",
      "Thursday",
      "Friday",
      "Saturday",
    ][w]
class Solution {
  public String dayOfTheWeek(int d, int m, int y) {
    if (m < 3) {
      m += 12;
      y -= 1;
    }
    int c = y / 100;
    y %= 100;
    int w = (c / 4 - 2 * c + y + y / 4 + 13 * (m + 1) / 5 + d - 1) % 7;
    return new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
      "Saturday"}[(w + 7) % 7];
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文