<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [LeetCode] 1360. Number of Days Between Two Dates 日期之間隔幾天


      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.

      這道題給了兩個 YYYY-MM-DD 格式的日期,讓返回兩個日期之間的天數,題目中限定了年份的范圍是 1971 年到 2100 年之間。根據題目中的兩個例子可以發現,兩個給定的日期之間的早晚關系是不確定的,為了使的 date1 的時間早于 date2,在最開始時做個小判斷,即當 date1 晚于 date2 時,返回調用原函數,并且調換 date1 和 date2 之間的順序。然后就是要分別提取出 date1 和 date2 中的年月日,由于給定的日期的格式是固定的,所以年月日所在的位置和長度也是固定的,可以用取子串的函數 substr 來取出年月日,并且調用字符串轉整型的函數 stoi 來得到整型數格式的年月日。

      接下來就要考慮如何實現計算兩個日期之間的天數了,雖然現在知道 date1 是早于 date2 的,但由于不知道年份是否相等,所以 date1 的月份跟 date2 的月份的大小關系是不確定的,不太好直接計算之間的天數。所以此時需要找一個基準點,這里比較方便的就是用其當年的1月1號,即計算出離當年一月一號之間的天數。這個可以用一個子函數 daysFromTheYear 來得到。為了方便整月天數的計算,可以將每個月的天數放到一個數組中,方便使用。還有就是要考慮閏年的問題,閏年的2月是有29天的,判斷閏年可以放到一個子函數中。想必大家對判斷閏年的方法都很熟悉了吧,若某個年份能被 100 整除,則其必須能被 400 整除的是閏年,還有就是不能被 100 整除,但能被4整除的年份也是閏年。

      有了統計天數的函數之外,還需要一個統計給定兩個年份之間的天數的子函數,因為 date1 和 date2 可能不是同一年,可能相差好幾年。這個整年之間的天數很好統計,除了閏年之外都是 365 天,對每個年份判斷一下,若是閏年,就多加1天。有了這兩個子函數,就可以求 date1 和 date2 之間的天數了,這里分兩種情況來討論:假如 date1 和 date2 是同一年的話,則分別計算其距離1月1號的天數,然后相減就是 date1 和 date2 之間的天數。若不在同一年,則計算 date1 的年份到 date2 的年份減1的整年之間的天數,然后要減去 date1 距其當年1月1號之間的天數,因為計算的是整年的天數,要減去這些多算的天數。然后還要加上 date2 具體其當前1月1號的天數,因為整年天數沒有算這一年,要把這些天數加上才行,參見代碼如下:


      解法一:

      class Solution {
      public:
          int daysBetweenDates(string date1, string date2) {
              if (date1 > date2) return daysBetweenDates(date2, date1);
              int y1 = stoi(date1.substr(0, 4)), m1 = stoi(date1.substr(5, 2)), d1 = stoi(date1.substr(8, 2));
              int y2 = stoi(date2.substr(0, 4)), m2 = stoi(date2.substr(5, 2)), d2 = stoi(date2.substr(8, 2));
              return y1 == y2 ? daysFromTheYear(y2, m2, d2) - daysFromTheYear(y1, m1, d1) : daysBetweenTwoYears(y1, y2 - 1) - daysFromTheYear(y1, m1, d1) + daysFromTheYear(y2, m2, d2);
          }
          int daysFromTheYear(int y, int m, int d) {
              int res = 0;
              vector<int> monthDays{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31};
              for (int i = 1; i < m; ++i) {
                  res += monthDays[i - 1];
              }
              if (m > 2 && isLeapYear(y)) ++res;
              return res + d;
          }
          int daysBetweenTwoYears(int y1, int y2) {
              if (y1 > y2) return daysBetweenTwoYears(y2, y1);
              int res = 0;
              for (int i = y1; i <= y2; ++i) {
                  res += 365;
                  if (isLeapYear(i)) res += 1;
              }
              return res;
          }
          bool isLeapYear(int year) {
              return (year % 100 == 0) ? (year % 400 == 0) : (year % 4 == 0);
          }
      };
      

      來看一種稍微簡單一點的解法,由于年份的范圍最早是 1971 年,那么可以將 1971 年1月1日當作基準點,分別計算 date1 和 date2 到 1971 年1月1日之間的天數,然后相減就可以得到 date1 和 date2 之間的天數了。計算到 1971 年1月1日的天數放到一個子函數中,先計算整年的天數,再計算整月的天數,再加上日的天數即可,注意還是要考慮閏年的情況,參見代碼如下:


      解法二:

      class Solution {
      public:
          int daysBetweenDates(string date1, string date2) {
              if (date1 > date2) return daysBetweenDates(date2, date1);
              int y1 = stoi(date1.substr(0, 4)), m1 = stoi(date1.substr(5, 2)), d1 = stoi(date1.substr(8, 2));
              int y2 = stoi(date2.substr(0, 4)), m2 = stoi(date2.substr(5, 2)), d2 = stoi(date2.substr(8, 2));
              return daysFrom1971(y2, m2, d2) - daysFrom1971(y1, m1, d1);
          }
          int daysFrom1971(int y, int m, int d) {
              int res = 0;
              vector<int> monthDays{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31};
              for (int i = 1971; i < y; ++i) {
                  res += 365;
                  if (isLeapYear(i)) ++res;
              }
              for (int i = 1; i < m; ++i) {
                  res += monthDays[i - 1];
              }
              if (m > 2 && isLeapYear(y)) ++res;
              return res + d;
          }
          bool isLeapYear(int year) {
              return (year % 100 == 0) ? (year % 400 == 0) : (year % 4 == 0);
          }
      };
      

      Github 同步地址:

      https://github.com/grandyang/leetcode/issues/1360


      類似題目:

      Count Days Spent Together


      參考資料:

      https://leetcode.com/problems/number-of-days-between-two-dates

      https://leetcode.com/problems/number-of-days-between-two-dates/solutions/517605/similar-to-day-of-the-year/

      https://leetcode.com/problems/number-of-days-between-two-dates/solutions/621582/c-short-simple-modular-solution/


      LeetCode All in One 題目講解匯總(持續更新中...)

      posted @ 2023-11-12 12:18  Grandyang  閱讀(149)  評論(0)    收藏  舉報
      Fork me on GitHub
      主站蜘蛛池模板: 乱人伦人妻精品一区二区| 青青草无码免费一二三区| 无码欧美毛片一区二区三| 亚洲精品男男一区二区| 色综合色综合色综合频道| 少妇高潮喷水惨叫久久久久电影 | 日本深夜福利在线观看| 国产午夜亚洲精品福利| 狠狠色婷婷久久综合频道日韩| 国产精品久久久久AV福利动漫| 吐鲁番市| 精品久久久久久无码不卡| 国产成人啪精品视频免费APP| 久久er99热精品一区二区| 少妇被粗大的猛烈进出动视频| 亚洲午夜福利AV一区二区无码| 亚洲精品综合一区二区在线| 性做久久久久久久| 国产亚洲精品久久综合阿香 | 樱桃视频影院在线播放| 亚洲日韩图片专区第1页| 男女xx00上下抽搐动态图| 国产呦交精品免费视频| 漂亮人妻被修理工侵犯| 午夜成人精品福利网站在线观看| 国产高清一区二区三区视频| 久久这里都是精品二| 色综合久久夜色精品国产| 国产精品人妻中文字幕| 欧美视频网站www色| 国产精品亚洲综合色区丝瓜| 高清破外女出血AV毛片| 久激情内射婷内射蜜桃| 99在线 | 亚洲| 国产亚洲AV电影院之毛片| 色窝窝免费播放视频在线| 夜夜添无码试看一区二区三区 | 男女无遮挡激情视频| 亚洲精品三区四区成人少| 免费乱理伦片在线观看| 国产91小视频在线观看|