文章目錄
- 題目
- 題目大意
- 解題思路
- 代碼如下
- 代碼細節
- 細節一
- 細節二
- 代碼二(這個就不講了,跟上一個代碼差不多):
題目

?
題目大意
題目表達出的意思很明顯:就是給你日期,讓我們計算出這個日期對應的是星期幾,
?
解題思路
首先要知道1971年第一天是星期幾,
通過查詢日歷得知 1971年第一天(1月1日)是星期五,【1970.12.31 為 星期四】
有人可能會有疑問:求這個第一天星期幾,有什么意義?
你這么想 題目會給我們一個日期,其目的:是想讓我們算出 所給 日期 是星期幾,
日期范圍:1971 ~ 2100年
重點就來了:既然知道了 日期底線:1971【準確來說是 1970.12.31】,那么,我可不可以這么去想,我先去得到底線日期是星期幾,之后的天數就網上累加,每累加一次,星期加一,沒問題吧?
由此引出我們解題的關鍵:我們只要計算 所給出年份 與底線 相差多少天,然后,把它加在底線的基礎上,就可以得出我們的最終結果,
舉個例子:
既然題目規定回傳值 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”},
那么,我們就需要為回傳值創建一個 字符陣列,來存盤回傳值,到時候,根據結果回傳對應的值,
假設這個陣列為: String[] week = {“Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”,“Sunday”};
然后,我們再 創建一個 days 來 記錄 給出年份與底線 相差多少天,
假設 days 的結果為 1,即 year == 1971,mont == 1,day == 1,對應日期:星期五,
此時要回傳值 就是星期五,再加上星期陣列week,
那么回傳:return week[(days + 3) % 7] ;理由如下:
當然,還有一些細節部分: 計算出所給日期 與底線的相差多少天,我們就需要考慮 所給日期 與 底線 中 有幾個閏年,閏年比普通年份多出一天(2月多出的),這一點請記住,
?
代碼如下
class Solution {
public String dayOfTheWeek(int day, int month, int year) {
String[] week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday","Sunday"};
// 1 ~ 11 月的天數
int[] monthDay = {31,28,31,30,31,30,31,31,30,31,30};
//年份與底線年份 相差天數
int days = 365*(year-1971) + (year - 1969)/4;
for(int i = 0; i < month -1;i++){// 加上日期年的月份天數
days += monthDay[i];
}
if( (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) && month >2){
days += 1;// 如果 日期年 是閏年,且日期月份 大于 2月,所以它的天數要加1
}
days += day;// 再加上日期月份零碎的幾天
return week[(days+3) % 7];
}
}

?
代碼細節
細節一

細節二

?
代碼二(這個就不講了,跟上一個代碼差不多):
class Solution {
public String dayOfTheWeek(int day, int month, int year) {
String[] week = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int[] monthDay = {31,28,31,30,31,30,31,31,30,31,30};
int days = 4;// 底線日期,對應星期四,下標也是 4
for(int i = 1971; i < year; i++){// 計算 日期年份 與 底線年份的天數差
boolean leap = i%400 == 0 || (i % 4 == 0 && i % 100 !=0);// 潤年為 true,平年為 false
days += leap ? 366 :365;// 閏年 366天,平年 365天
}
for(int i = 0;i < month-1;i++){
days += monthDay[i];
if(i == 2 && (year % 400 == 0 || year % 4 == 0 && year % 100 !=0)){
days += 1;// 如果給定年份year 為閏年,且經歷過2月,需要加一天,
}
}
days += day;
return week[days % 7];
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/402722.html
標籤:java
上一篇:堆疊和佇列及其背后的資料結構


