第几天问题求解

本文介绍了两种解决计算日期是当年第几天的方法。方法一是通过手动计算,涉及闰年的判断,split方法的使用以及switch-case语句。方法二是利用Java的Calendar类,简化了计算过程。文章提供了详细的代码示例,并分享了解题过程中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

第几天

题目描述

这是一个很经典的题,给定一个日期,输出这个日期是该年的第几天。

输入

输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成(见样例) ,另外,可以向你确保所有的输入数据是合法的。

输出

对于每组输入数据,输出一行,表示该日期是该年的第几天。

样例输入

1985/1/20
2006/3/12

样例输出

20
71

方法一:暴力求和
  • 所用知识点: 所用知识点: 所用知识点:

    闰年的判断
    split()方法的使用
    String类型转int类型
    switch case流程控制

    闰年的判断: 闰年的判断: 闰年的判断:
    普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰 年)。
    世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是 闰年)。

    s p l i t ( ) 方法的使用: split()方法的使用: split()方法的使用:括号中可以接一个参数,也可以接两个参数

    • 接一个参数:split(String regex)将字符串按照regex分割成若干个字串(相当于是将字符串中含有 regex的全部挖掉),regex可以是正则表达式,也可以是字符、字符串
    • 接两个参数:split(String regex,int limit)将字符串按照regex分割成limit份(相当于是按照字符串索引号从小到大的顺序依次挖掉 limit-1 个regex)

    S t r i n g 类型转 i n t 类型 : String类型转int类型: String类型转int类型:参考文章👉基本数据类型与引用数据类型String之间的转换及基本数据之间的转换

    s w i t c h ( )    c a s e : switch()~~case: switch()  case:作用是找到相应的case,如果后面没加break就会进入下一个case。
    注意事项:switch括号中控制的表达式类型只能是byte、char、short、int、String类型或enum(枚举型)类型(总结来讲:就是基本数据类型中不支持浮点型和boolean型,引用数据类型只支持String型和enum型)

  • 解题分析: 解题分析: 解题分析:
    首先我们需要判断输入的年份是否是闰年,这才是题目的核心所在。闰年比平年在2月份要多一天,明确了这一个点这个题目就很简单了。

    import java.util.Scanner;
    
    public class Main {
    public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		String sts = null;
        	String[] time = null;
        	int sum;
        	while(sc.hasNext()) {
        		sum = 0;
        		sts = sc.next();
        		time = sts.split("\\/");
        		switch(Integer.parseInt(time[1])) {
        		case 1:sum=0;break;
        		case 2:sum=31;break;
        		case 3:sum=59;break;
        		case 4:sum=90;break;
        		case 5:sum=120;break;
        		case 6:sum=151;break;
        		case 7:sum=181;break;
        		case 8:sum=212;break;
        		case 9:sum=243;break;
        		case 10:sum=273;break;
        		case 11:sum=304;break;
        		case 12:sum=334;break;
        		}
        		sum += Integer.parseInt(time[2]);
        		if(Integer.parseInt(time[1])>2 && check(time[0])) {
        			sum++;
        		}
        		System.out.println(sum);
        	}
        	sc.close();
    	}
    	//判断闰年
    	public static boolean check(String n) {
    		int year = Integer.parseInt(n);
    		if((year%100!=0 && year%4==0)||(year%400==0)) {
    			return true;
    		}else {
    			return false;
    		}
    	}
    }
    

    如果你懒得计算sum还可以这样写

    import java.util.Scanner;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		String sts = null;
        	String[] time = null;
        	int[] day = {31,28,31,30,31,30,31,31,30,3130};//将11个月份的天数用一个数组存起来
        	int sum;
        	while(sc.hasNext()) {
        		sum = 0;
        		sts = sc.next();
        		time = sts.split("\\/");
        		switch(Integer.parseInt(time[1])) {
        		case 12:sum+=day[10];
        		case 11:sum+=day[9];
        		case 10:sum+=day[8];
        		case 9:sum+=day[7];
        		case 8:sum+=day[6];
        		case 7:sum+=day[5];
        		case 6:sum+=day[4];
        		case 5:sum+=day[3];
        		case 4:sum+=day[2];
        		case 3:sum+=day[1];
        		case 2:sum+=day[0];
        		case 1:sum+=0;break;//break写不写都无所谓
        		}
        		sum += Integer.parseInt(time[2]);
        		if(Integer.parseInt(time[1])>2 && check(time[0])) {
        			sum++;
        		}
        		System.out.println(sum);
        	}
        	sc.close();
    	}
    	//判断闰年
    	public static boolean check(String n) {
    		int year = Integer.parseInt(n);
    		if((year%100!=0 && year%4==0)||(year%400==0)) {
    			return true;
    		}else {
    			return false;
    		}
    	}
    }
    

使用方法一解题期间遇到的问题
在使用sc.hasNext()接收多行输入时,无法结束循环。在这篇文章找到了解答,附原文链接:Java while(sc.hasNext())无法跳出循环的问题


方法二:巧用Calendar类
  • 所用知识点: 所用知识点: 所用知识点:

    利用SimpleDateFormat类中的parse()方法将字符串转成Date对象
    利用Calendar直接输出当前年份天数

    相关知识点可以查看文章:JavaSE基础回顾7.77.8小节的内容

package com.hhxy.practice;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws ParseException {
        Scanner sc=new Scanner(System.in);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");//提供字符串格式
        while(sc.hasNext()){
            Date d = sdf.parse(sc.next());//将相应字符串格式转成相应的Date对象
            Calendar c = Calendar.getInstance();//创建Calendar对象
            c.setTime(d);//将日历设置成当前年份的日历
            System.out.println(c.get(Calendar.DAY_OF_YEAR));//直接输出当前日期所在日历的第几天
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识汲取者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值