2021计算机大厂面试题解析之Brother数数月份问题

img


package cn.xaut;


import java.util.Scanner;

public class T_two {
    public static void main(String[] args) {
        //星期 1,2,3,4,5,6,7分别代表周几
        int weekNumber[]={1,2,3,4,5,6,7};
        //通过提示得知202111日是星期五。那可以推出输入的开始年份的一月一日是星期几
        Scanner sc = new Scanner(System.in);
        int start = sc.nextInt();
        int end=sc.nextInt();
        //输入的开始年份和2021相差的年数
        int yearNum = Math.abs(start - 2021);
        //通过遍历计算2021与开始的年数中有几个闰年,从而计算出开始年份与2021一共相差多少天,在拿这个数对七求余数
        int countBigyear=0;
        if(start>=2021){
            for (int i=2021;i<start;i++){
                if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0){//是闰年
                    countBigyear++;
                }
            }
        }else{
            for (int i=start;i<2021;i++){
                if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0){//是闰年
                    countBigyear++;
                }
            }
        }
        int smallYear=yearNum-countBigyear;
        int sumDay=smallYear*365+366*countBigyear;
        //System.out.println("相差"+sumDay+"天");
        //相差几天
        int weekday= sumDay%7;
        int startWeekNum=0;
        if(start>2021){
            startWeekNum=(5+weekday)%7;
        }else{
            startWeekNum=Math.abs((5-weekday))%7;
        }
        //System.out.println(start+"年的1月1日是星期:"+startWeekNum);
        //星期指针
        int indexWeek=startWeekNum;
        //计数器
        int count=0;
        //默认end年份的一月一日不是星期1
        boolean lastFirstMonth=false;
        //%7  [0,1,2,3,4,5,6]0为星期一
        indexWeek=indexWeek-1;
        for(int i=start; i<=end; i++){
            //判断21日是否为星期1
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的2月1日是星期"+(indexWeek+1));
            //判断31if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0){//是闰年
                indexWeek=(((29%7)+indexWeek))%7;
                if(indexWeek==0){
                    count++;
                }
                System.out.println(i+"润年的3月1日是星期"+(indexWeek+1));
            }else{//非闰年
                indexWeek=(((28%7)+indexWeek))%7;
                if(indexWeek==0){
                    count++;
                }
                System.out.println(i+"非润年的3月1日是星期"+(indexWeek+1));
            }
            //判断41日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的4月1日是星期"+(indexWeek+1));
            //判断51日
            indexWeek=(((30%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的5月1日是星期"+(indexWeek+1));
            //判断61日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的6月1日是星期"+(indexWeek+1));
            //判断七月1日
            indexWeek=(((30%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的7月1日是星期"+(indexWeek+1));
            //判断八月1日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的8月1日是星期"+(indexWeek+1));
            //判断九月1日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的9月1日是星期"+(indexWeek+1));
            //判断十月1日
            indexWeek=(((30%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的10月1日是星期"+(indexWeek+1));
            //判断十一月1日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的11月1日是星期"+(indexWeek+1));
            //判断十二月1日
            indexWeek=(((30%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
            }
            System.out.println(i+"年的12月1日是星期"+(indexWeek+1));
            //判断下一年的11日
            indexWeek=(((31%7)+indexWeek))%7;
            if(indexWeek==0){
                count++;
                lastFirstMonth=true;
            }else{
                lastFirstMonth=false;
            }
            System.out.println((i+1)+"年的1月1日是星期"+(indexWeek+1));
        }
        if(lastFirstMonth){
            count=count-1;
        }
        System.out.println(count);
    }
}