题解《算法零基础100讲》(第6讲) 日期算法(java版)

Posted 敲代码的xiaolang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解《算法零基础100讲》(第6讲) 日期算法(java版)相关的知识,希望对你有一定的参考价值。

算法小白欢迎加入此社区https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入。

本博文是对此文章习题所作的题解,如有不足,请多指教:
https://blog.csdn.net/WhereIsHeroFrom/article/details/120875184

本文涉及对闰年的处理,对一年中日期对应天数的处理,笔者曾写过一个比较简单的C语言版本的,可以供大家参考:https://blog.csdn.net/weixin_52605156/article/details/117821191

第一题:
链接:https://leetcode-cn.com/problems/day-of-the-week/

题目分析:
关键在于需要查找得到1971年1月1日是星期五。
然后分析题目,起码需要有对闰年的处理,需要考虑输入的日期与我们起始日期,也就是1971年1月1日的关系。
具体分析步骤在代码中注释,这里简单写一下思路:
先用数组处理每个月的天数,先考虑平年,然后再考虑闰年的时候,对天数进行特殊的考虑,然后在对对应星期几处理的时候,应当分析所定义的数组与你所求的天数对7取余的关系。

class Solution {
    public String dayOfTheWeek(int day, int month, int year) {
        /*先定义一个数组去承接平年的时候的每一个月的天数*/
        int[] array=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
        int i;
        /*先由你输入的月份,确定存入的天数*/
        for(i = 1; i < month; i++){
	        day = day + array[i];
        }
        /*定义一个变量去承接闰年,如果是1,那么是闰年,是0,则为平年*/
        int runnian = 0;
        if(year%4==0&&year%100!=0||year%400==0){
	        runnian=1;
	    }
        int days=0;/*定义新的变量去承接天数*/
        if(runnian == 1){
        if(runnian == 1&&month > 2){
            days = day + 1; /*如果是闰年,并且月份比2月大,我们再加一*/
        }
        if(runnian==1&&month<=2)
        {
            days=day;
        }
        }
        if(runnian==0)
        {
            days=day;
        }
        
        int num;
        num = (year - 1971)*365 + days; 
        /*求你输入的年月日距离1971年有多少年,先都当作平年计算*/
        int number = 0,j;
        for(j = 1971; j < year; j++){
        /*再次遍历,求出里面的闰年的个数,用number去承接*/
            if(j%4==0&&j%100!=0||j%400==0){
                number++;
            }
        }
        num = num + number +6;
        /*因为1971年1月1日是周五,所以我们定义的数组起始也定义为周五
		那么为什么要  num = num + number +6; 
		因为我们 Friday 是第一个元素,我们再补充给它6个元素,那么它就正好形成一个循环,方便我们进行取余操作
        */
     	String[] weeks = new String[]{"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
        int w = ((num)%7);
        return weeks[w];
    }
}

第二题:
链接:https://leetcode-cn.com/problems/day-of-the-year/

题目分析:
跟笔者文前放置的C语言版本类似,先把天数存入到一个数组里面,然后取出所输入的字符串的对应位数,如果是闰年,再进行相应的操作。

class Solution {
    public int dayOfYear(String date) {
        int []array = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
        int year=0,month=0,day=0,count=0;
        int i;
        year=Integer.parseInt(date.substring(0,4));

        month=Integer.parseInt(date.substring(5,7));

        day=Integer.parseInt(date.substring(8,10));

        if(year%4==0&&year%100!=0||year%400==0){
            array[2]=29;
        }

        for(i=1; i<month; i++){
            count = count + array[i];
        }
        count = count + day;
        return count;
    }
}

第三题:
链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates/

题目分析:
跟第二题一样,使用两个数组,只不过加上了一个对年的判断,然后求出两组数之后,再进行相减。

class Solution {
    public int daysBetweenDates(String date1, String date2) {
    /*使用两个数组,都先定义成平年的类型*/
        int []array = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
        int []array1 = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
        int year=0,year1=0,month=0,month1=0,day=0,day1=0,count=0,count1=0;
        int i;
        /*取相应的位数进行运算*/
        year=Integer.parseInt(date1.substring(0,4));
        year1=Integer.parseInt(date2.substring(0,4));
       
        month=Integer.parseInt(date1.substring(5,7));
        month1=Integer.parseInt(date2.substring(5,7));
       
        day=Integer.parseInt(date1.substring(8,10));
        day1=Integer.parseInt(date2.substring(8,10));
         /*如果是闰年,我就把二月的部分改成29*/
        if(year%4==0&&year%100!=0||year%400==0){
            array[2]=29;
        }
        if((year1%4==0&&year1%100!=0)||year1%400==0){
             array1[2]=29;
        }
        /*对年数的操作*/
        for(i=1971; i<year; i++){
            if(i%4==0&&i%100!=0||i%400==0){
                count = count + 366;
            }else{
                count = count + 365;
            }
        }
        for(i=1; i<month; i++){
          count = count + array[i];
        }
        count = count + day;
        for(i=1971; i<year1; i++){
            if(i%4==0&&i%100!=0||i%400==0){
                count1 = count1 + 366;
            }else{
                count1 =count1 + 365;
            }
        }
        for(i=1;i<month1;i++){
          count1 = count1 + array1[i];
        }
        count1 =count1 + day1;
        /*进行做差比较*/
        return Math.abs(count-count1);
    }
}

有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。

以上是关于题解《算法零基础100讲》(第6讲) 日期算法(java版)的主要内容,如果未能解决你的问题,请参考以下文章

题解《算法零基础100讲》(第7讲---丑数) (java版)

题解《算法零基础100讲》(第17讲) 线性枚举 - 最值算法(java版)

题解《算法零基础100讲》(第26讲) 字符串算法 - 回文串(java版)

题解《算法零基础100讲》(第8讲) 素数筛选(java版)

题解《算法零基础100讲》(第9讲) 算术基本定理(java版)

题解《算法零基础100讲》(第15讲) 二分快速幂(java版)