2020年蓝桥杯省赛试题——跑步锻炼(填空题)
题目描述:
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 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 }