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 }

 

posted @ 2021-03-29 18:22  没有你哪有我  阅读(1987)  评论(0编辑  收藏  举报