題目描述:
小藍每天都鍛煉身體。
正常情況下,小藍每天跑 1 千米。如果某天是周一或者月初(1 日),為了激勵自己,小藍要跑 2 千米。如果同時是周一或月初,小藍也是跑 2 千米。
小藍跑步已經堅持了很長時間,從 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。請問這段時間小藍總共跑步多少千米?
這道題個人感覺沒別的,就只能死算,希望能有大佬指點迷津,看看這道題有沒有什么技巧能快速出答案
學習體驗
這道題讓我再次回顧了一下Java中處理日期時間的API,果然真的好久沒用都生疏了,寫這題竟然都用了半個多小時,看來以后得多敲代碼了,畢竟熟能生巧嘛。這題當中我用到了Calendar類中的一些方法,比如獲取今天是星期幾(get(int field)),還有after(Date date) ,after方法可以用來推到出兩個日期相隔多少天
1、注意月份,一月是0,二月是1,。。。以此類推
2、星期天是1,星期一是2,星期二是3,。。。以此類推
Java代碼:
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Calendar; 4 import java.util.Date; 5 6 public class Main3 { 7 public static void main(String[] args) throws ParseException { 8 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 9 // 一共多少天 10 Date start = sdf.parse("2000-01-01"); 11 Date end = sdf.parse("2020-10-01"); 12 13 Date temp = new Date(start.getTime()); 14 // 當前也算一天 15 int day = 1; 16 17 // after()方法,判斷當前日期是否在指定日期的后面,如果是則返回true,反之,則返回false 18 while (end.after(temp)) { 19 temp = new Date(temp.getTime() + 24 * 60 * 60 * 1000); 20 day++; 21 } 22 System.out.println("一共要跑" + day + "天"); 23 24 25 // 中間一共有幾個周一,當前是周六 26 int monday = (day - 5) / 7 + ((day - 5) % 7 == 0 ? 0 : 1); 27 System.out.println("周一有" + monday + "天"); 28 // 有幾個月初 29 int monthStart = 20 * 12 + 10; 30 System.out.println("月初有" + monthStart + "天"); 31 // 有幾個周一與月初在同一天 32 int sameDay = 0; 33 34 Calendar c = Calendar.getInstance(); 35 int year = 2000; 36 // 這里要注意月份 一月是0,二月是1,。。。以此類推 37 // 星期天是1,星期一是2,星期二是3,。。。以此類推 38 c.set(year, 0, 1); 39 while (c.get(Calendar.YEAR) != 2020 || c.get(Calendar.MONDAY) != 10 || c.get(Calendar.DATE) != 1) { 40 // 判斷 41 int weekday = c.get(Calendar.DAY_OF_WEEK) - 1; 42 if (weekday == 1) { 43 sameDay++; 44 } 45 // 每次往后推一個月 46 if (c.get(Calendar.MONTH) < 12) { 47 c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1); 48 } else { 49 year++; 50 c.set(Calendar.YEAR, year); 51 c.set(Calendar.MONTH, 1); 52 } 53 } 54 System.out.println("同時是周一或月初:" + sameDay); 55 56 int twoKilo = monthStart + monday - sameDay; 57 int oneKilo = day - twoKilo; 58 59 int totalKilo = oneKilo + twoKilo * 2; 60 System.out.println("一共要跑:" + totalKilo + "千米"); 61 } 62 }
運行結果:

大佬的思路:太奇妙了
1 import java.util.*; 2 import java.text.*; 3 4 public class Main { 5 public static void main(String[] args) throws Exception{ 6 long oneDay = 1000 * 60 * 60 * 24; 7 8 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 9 10 long start = sdf.parse("2000-01-01 00:00:00").getTime();; 11 long end = sdf.parse("2020-10-01 00:00:00").getTime(); 12 13 int ans = 0; 14 while (start <= end) { 15 if (new Date(start).toString().contains("Mon") || new Date(start).toString().contains(" 01 ")) { 16 ans += 2; 17 } else { 18 ans++; 19 } 20 // 加一天 21 start = new Date(start).getTime() + oneDay; 22 } 23 24 System.out.println(ans); 25 } 26 }
