• 【LeetCode】一周中的第几天+ 一年中的第几天


    2023-12-30

    一周中的第几天

    在这里插入图片描述

    • 提示:给出的日期一定是在 19712100 年之间的有效日期。
    方法一:模拟
    思路
    • 1.可以根据1970年的最后一天(周四),计算出和输入日期间隔了几天(ans+之前的年份天数和+当前的月份天数和+输日的天数)

    • 2.求出具体的天数之后进行取模,得到具体的星期

    步骤

    1.定义一个字符串类型的数组,大小为7,记录星期字典

    定义一个int类型的数组,大小为12,记录12个月份分别对应的天数(闰年进行判断)

    2.定义一个初始天数ans=4(从周四开始)

    3.从1971年开始遍历,直到输入的年份,判断当前年是否为闰年,初始值加上对应的天数

    4.遍历月份直到输入月份,二月的情况根据是否是闰年来加上额外的一天

    5.最后加上输入的天数,所求之和取模

        static String[] week =new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        //每周对应的星期
        static int[] nums = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
        //每个月对应的天数
        public String dayOfTheWeek(int day, int month, int year) {
            int ans = 4;//初始值为4,从周四开始
            for (int i = 1971; i < year; i++) {
                boolean isLeapYear = (i % 4 == 0 && i % 100 != 0) || i % 400 == 0;
                //判断是否为闰年
                ans += isLeapYear ? 366 : 365;
                //是闰年加366,不是加355
            }
            for (int i = 1; i < month; i++) {
                ans += nums[i - 1];
                //之前的月份数之和
                if (i == 2 && ((year % 4 == 0 && year% 100 != 0) || year % 400 == 0)){
                    ans++;//如果当前是闰年,单独加1
                }
            }
            ans += day;//加上输入的天数
            return week[ans % 7];
            //求模返回对应星期
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    方法二:调用库函数

    1.使用LocalDate.of(year, month, day)创建了一个LocalDate对象date,表示给定的日期。LocalDate是Java 8中新增的日期类,用于处理日期相关操作。(Java8新增)

    2.通过调用date.getDayOfWeek()方法获取该日期的星期几信息,getDayOfWeek()返回的是一个DayOfWeek枚举类型,表示星期几。

    3.最后,通过调用getDisplayName(TextStyle.FULL_STANDALONE, Locale.ENGLISH)方法,将星期几信息以全名的形式返回,使用英语的地区设置。

    import java.time.LocalDate;
    import java.time.format.TextStyle;
    import java.util.*;
    
    class Solution {
    
        public String dayOfTheWeek2(int day, int month, int year) {
            LocalDate date = LocalDate.of(year, month, day);
            //创建了一个`LocalDate`对象`date`,表示给定的日期
            return date.getDayOfWeek().getDisplayName(TextStyle.FULL_STANDALONE, Locale.ENGLISH);
            //方法获取该日期的星期几信息
            //将星期几信息以全名的形式返回,使用英语的地区设置
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    方法三:调用库函数

    1.首先声明了一个私有的静态变量calendar,并调用其静态方法getInstance()获取一个默认时区的Calendar实例。然后声明了一个私有的静态变量weekFormat,它是一个SimpleDateFormat对象,用于格式化星期几信息。

    2.使用set(year, month - 1, day)方法将calendar设置为给定日期。由于Calendar中的月份从0开始,所以需要将传入的month减去1

    3.使用weekFormat.format(calendar.getTime())方法将calendar中的时间格式化为星期几的字符串,其中weekFormat是一个SimpleDateFormat对象,通过设置格式为"EEEE"来表示星期几的全名形式

        private static final Calendar calendar = Calendar.getInstance();
    //获取一个默认时区的`Calendar`实例
        private static final SimpleDateFormat weekFormat = new SimpleDateFormat("EEEE");
    //格式化星期几信息
    
        public String dayOfTheWeek3(int day, int month, int year) {
            calendar.set(year, month - 1, day);
           // 将`calendar`设置为给定日期
            return weekFormat.format(calendar.getTime());
            //`calendar`中的时间格式化为星期几的字符串
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1154. 一年中的第几天

    在这里插入图片描述

    方法一:直接计算
    思路:

    1.根据所给的字符串,分别截取出年月日的信息,转化成整数

    2.根据当前年份,判断是否为闰年,是闰年:二月加1

    3.之前月份天数之和,最后加上天数的信息

     
    public int dayOfYear(String date) {
            int year = Integer.parseInt(date.substring(0, 4));
            int month = Integer.parseInt(date.substring(5, 7));
            int day = Integer.parseInt(date.substring(8));
            //调用substring分别截取出年月日的信息,转化为整数
    
            int[] monthes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
            //每个月份的天数
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                ++monthes[1];
            }//如果当前的闰年,二月加1天(直接改变月份字典中的数)
    
            int ans = 0;
            for (int i = 0; i < month - 1; ++i) {
                ans += monthes[i];//每个月天数之和
            }
            return ans + day;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    方法二:调用库函数
    思路

    1.指定日期字符串的格式

    2.解析为 LocalDate 对象

    3.返回该日期在其所属年份中的天数

        private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    //定义了一个 DateTimeFormatter 对象,它指定了日期字符串的格式为 "yyyy-MM-dd"
    
        public int dayOfYear2(String date) {
            return LocalDate.parse(date, formatter).getDayOfYear();
            //LocalDate.parse() 方法将日期字符串解析为 LocalDate 对象
            //getDayOfYear() 方法则返回该日期在其所属年份中的天数
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    点击移步博客主页,欢迎光临~

    偷cyk的图

  • 相关阅读:
    2023年5月14日蓝桥杯c++省赛中级组
    LeetCode-61-旋转链表
    全国各地行业网站SEO词系统+正版授权+SEO优化
    使用Postman快速复现浏览器的请求(包括生成调用代码)
    4.2 实现注册与登录模块
    目标检测卷王YOLO卷出新高度:YOLOv9问世
    求免费好用的问卷调查平台!
    Linux内存管理(三):内存与内存分布
    合肥先进光源束测后台的初步设计
    Scala第三章节
  • 原文地址:https://blog.csdn.net/m0_64003319/article/details/136377105