返回介绍

solution / 1300-1399 / 1360.Number of Days Between Two Dates / README_EN

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

1360. Number of Days Between Two Dates

中文文档

Description

Write a program to count the number of days between two dates.

The two dates are given as strings, their format is YYYY-MM-DD as shown in the examples.

 

Example 1:

Input: date1 = "2019-06-29", date2 = "2019-06-30"
Output: 1

Example 2:

Input: date1 = "2020-01-15", date2 = "2019-12-31"
Output: 15

 

Constraints:

  • The given dates are valid dates between the years 1971 and 2100.

Solutions

Solution 1: Mathematics

First, we define a function isLeapYear(year) to determine whether the given year year is a leap year. If it is a leap year, return true, otherwise return false.

Next, we define another function daysInMonth(year, month) to calculate the total number of days in the given year year and month month. We can use an array days to store the number of days in each month, where days[1] represents the number of days in February. If it is a leap year, it is $29$ days, otherwise it is $28$ days.

Then, we define another function calcDays(date) to calculate the number of days from the given date date to 1971-01-01. We can use date.split("-") to split the date date into year year, month month, and day day by -. Then we can use a loop to calculate the total number of days from 1971 to year, then calculate the total number of days from January to month, and finally add day days.

Finally, we only need to return the absolute value of calcDays(date1) - calcDays(date2).

The time complexity is $O(y + m)$, where $y$ represents the number of years from the given date to 1971-01-01, and $m$ represents the number of months of the given date. The space complexity is $O(1)$.

class Solution:
  def daysBetweenDates(self, date1: str, date2: str) -> int:
    def isLeapYear(year: int) -> bool:
      return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

    def daysInMonth(year: int, month: int) -> int:
      days = [
        31,
        28 + int(isLeapYear(year)),
        31,
        30,
        31,
        30,
        31,
        31,
        30,
        31,
        30,
        31,
      ]
      return days[month - 1]

    def calcDays(date: str) -> int:
      year, month, day = map(int, date.split("-"))
      days = 0
      for y in range(1971, year):
        days += 365 + int(isLeapYear(y))
      for m in range(1, month):
        days += daysInMonth(year, m)
      days += day
      return days

    return abs(calcDays(date1) - calcDays(date2))
class Solution {
  public int daysBetweenDates(String date1, String date2) {
    return Math.abs(calcDays(date1) - calcDays(date2));
  }

  private boolean isLeapYear(int year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  private int daysInMonth(int year, int month) {
    int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    days[1] += isLeapYear(year) ? 1 : 0;
    return days[month - 1];
  }

  private int calcDays(String date) {
    int year = Integer.parseInt(date.substring(0, 4));
    int month = Integer.parseInt(date.substring(5, 7));
    int day = Integer.parseInt(date.substring(8));
    int days = 0;
    for (int y = 1971; y < year; ++y) {
      days += isLeapYear(y) ? 366 : 365;
    }
    for (int m = 1; m < month; ++m) {
      days += daysInMonth(year, m);
    }
    days += day;
    return days;
  }
}
class Solution {
public:
  int daysBetweenDates(string date1, string date2) {
    return abs(calcDays(date1) - calcDays(date2));
  }

  bool isLeapYear(int year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  int daysInMonth(int year, int month) {
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    days[1] += isLeapYear(year);
    return days[month - 1];
  }

  int calcDays(string date) {
    int year = stoi(date.substr(0, 4));
    int month = stoi(date.substr(5, 2));
    int day = stoi(date.substr(8, 2));
    int days = 0;
    for (int y = 1971; y < year; ++y) {
      days += 365 + isLeapYear(y);
    }
    for (int m = 1; m < month; ++m) {
      days += daysInMonth(year, m);
    }
    days += day;
    return days;
  }
};
func daysBetweenDates(date1 string, date2 string) int {
  return abs(calcDays(date1) - calcDays(date2))
}

func isLeapYear(year int) bool {
  return year%4 == 0 && (year%100 != 0 || year%400 == 0)
}

func daysInMonth(year, month int) int {
  days := [12]int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
  if isLeapYear(year) {
    days[1] = 29
  }
  return days[month-1]
}

func calcDays(date string) int {
  year, _ := strconv.Atoi(date[:4])
  month, _ := strconv.Atoi(date[5:7])
  day, _ := strconv.Atoi(date[8:])
  days := 0
  for y := 1971; y < year; y++ {
    days += 365
    if isLeapYear(y) {
      days++
    }
  }
  for m := 1; m < month; m++ {
    days += daysInMonth(year, m)
  }
  days += day
  return days
}

func abs(x int) int {
  if x < 0 {
    return -x
  }
  return x
}
function daysBetweenDates(date1: string, date2: string): number {
  return Math.abs(calcDays(date1) - calcDays(date2));
}

function isLeapYear(year: number): boolean {
  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}

function daysOfMonth(year: number, month: number): number {
  const days = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  return days[month - 1];
}

function calcDays(date: string): number {
  let days = 0;
  const [year, month, day] = date.split('-').map(Number);
  for (let y = 1971; y < year; ++y) {
    days += isLeapYear(y) ? 366 : 365;
  }
  for (let m = 1; m < month; ++m) {
    days += daysOfMonth(year, m);
  }
  days += day - 1;
  return days;
}

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

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

发布评论

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