2.1.蓝桥杯-日期问题

[蓝桥杯】跑步问题的公式解法(蔡勒公式) 如何使用蔡勒公式快速换算星期几与枚举 阅读详情

题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入描述

一个日期,格式是 "AA/BB/CC" (0≤A,B,C≤9)。

输出描述

输出若干个不相同的日期,每个日期一行,格式是 "yyyy−MM−dd"。多个日期按从早到晚排列。

输入输出样例

示例

输入

02/03/04

输出

2002-03-04
2004-02-03
2004-03-02

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 256M

总通过次数: 6845 | 总提交次数: 8978 | 通过率: 76.2%

难度: 困难 标签: 2017, 暴力, 枚举, 省赛


思路:

1.首先输入日期:其中用到了Scanner类实现键盘录入

//1.输入日期
        String data=scan.next();

2.根据题意:输入的字符串里有两个/即AA/BB/CC,AA,BB和CC各自都可以作为年月日,因此可以利用String类里的split方法将键盘录入的data进行拆分成AA,BB和CC,然后存入字符串数组:

//2.遇见/把data拆分
        String[] s=data.split("/");

解析String类里的split方法:

package a39practice;
​
public class Test3 {
    public static void main(String[] args) {
        String str="02/03/04";
        String[] result=str.split("/");//代表在串str里遇见/就拆分一次存入字符串数组
        for (String s : result) {
            System.out.println(s);
        }
        /*运行结果为
         02
         03
         04
        */
    }
}
​

3.此时字符串数组result里存入的三个数据就是年月日:题目中有年月日,按题意为年月日,日年月,日月年

//3.拼接日期:
        /*题目中有年月日,按题意为年月日,日年月,日月年*/
        String y=s[0],m=s[1],d=s[2]; //y年,m月,d日

注:谁做年,谁做月,谁做日不是固定的,变量名y,m,d只是名;

4.根据题意拼接成日期:

String str1=( Integer.parseInt(y)<60 ? "20"+y : "19"+y ) + "-" + m + "-" + d;
String str2=( Integer.parseInt(d)<60 ? "20"+d : "19"+d ) + "-" + y + "-" + m;
String str3=( Integer.parseInt(d)<60 ? "20"+d : "19"+d ) + "-" + m + "-" + y;

包装类Integer的parseInt方法解析:把字符串转化为整数值

5.把拼接好的日期(字符串型)存入TreeSet集合,之所以存入TreeSet集合,是因为题目要求拼接好的日期需要从小到大排序,而TreeSet集合就有把存入的数据进行升序排列的特性,最后再遍历集合:

//4.存入TreeSet集合,因为TreeSet集合能够自动排序
        TreeSet<String> ts=new TreeSet<>();
        if( flag(str1) ) ts.add(str1);
        if( flag(str2) ) ts.add(str2);
        if( flag(str3) ) ts.add(str3);
​
        //5.遍历
        for (String t : ts) {
            System.out.println(t);
        }

6.关键:对于日期,可能出现不合法的数据,如2000-02-30,2月没有30号,是错的,因此就不能存入集合,所以就需要定义一个方法来判断日期的合法性:

//判断日期是否合法的方法:比如2000-02-30就不合法,2月没有30号
    private static boolean flag(String str){
        /*SimpleDateFormat sdf=new SimpleDateFormat(str);
        try {
            sdf.isLenient();
        }catch (Exception e){
            return false;
        }
        return true;*/
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); //题目里要求的日期正则表达式
        format.setLenient(false); //严格检查日期,要关闭lenient,传入false
        try {
            format.parse(str); //parse返回日期
        }catch (Exception e){
            return  false;
        }
        return  true;
    }

类SimpleDateFormat:

所用到的构造方法传入的形参:

用到的setLenient方法:传入false,因为要严格处理日期

进行异常处理:用到的parse方法,日期非法返回false,日期合法返回true


完整代码:

package a43practice;

import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        //1.输入日期
        String data=scan.next();

        //2.遇见/把data拆分
        String[] s=data.split("/");

        //3.拼接日期:
        /*题目中有年月日,按题意为年月日,日年月,日月年*/
        String y=s[0],m=s[1],d=s[2]; //y年,m月,d日
        /*//字符5的ASCII码为53
        String str1= y.charAt(0)>53 ? "19" : "20"+ y + "-" + m + "-" + d;
        String str2= d.charAt(0)>53 ? "19" : "20"+ d + "-" + y + "-" + m;
        String str3= d.charAt(0)>53 ? "19" : "20"+ d + "-" + m + "-" + y;*/
        /*String str1= Integer.parseInt(y)>59 ? "19" : "20"+ y + "-" + m + "-" + d;
        String str2= Integer.parseInt(d)>59 ? "19" : "20"+ d + "-" + y + "-" + m;
        String str3= Integer.parseInt(d)>59 ? "19" : "20"+ d + "-" + m + "-" + y;*/
        String str1=( Integer.parseInt(y)<60 ? "20"+y : "19"+y ) + "-" + m + "-" + d;
        String str2=( Integer.parseInt(d)<60 ? "20"+d : "19"+d ) + "-" + y + "-" + m;
        String str3=( Integer.parseInt(d)<60 ? "20"+d : "19"+d ) + "-" + m + "-" + y;

        //4.存入TreeSet集合,因为TreeSet集合能够自动排序
        TreeSet<String> ts=new TreeSet<>();
        if( flag(str1) ) ts.add(str1);
        if( flag(str2) ) ts.add(str2);
        if( flag(str3) ) ts.add(str3);

        //5.遍历
        for (String t : ts) {
            System.out.println(t);
        }
    }

    //判断日期是否合法的方法:比如2000-02-30就不合法,2月没有30号
    private static boolean flag(String str){
        /*SimpleDateFormat sdf=new SimpleDateFormat(str);
        try {
            sdf.isLenient();
        }catch (Exception e){
            return false;
        }
        return true;*/
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); //题目里要求的日期正则表达式
        format.setLenient(false); //严格检查日期,要关闭lenient,传入false
        try {
            format.parse(str); //parse返回日期
        }catch (Exception e){
            return  false;
        }
        return  true;
    }
}

Java实现蓝桥杯日期问题 历届试题 日期问题 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述   小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与... 阅读详情

相关推荐

Java实现第八届蓝桥杯日期问题

日期问题 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。 比如02/03/04,可能是2002年03月04日、...

南 墙 1万+

蓝桥杯-日期问题-java

日期问题 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。 更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。 比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。 给出一个文献

seabirdssss的博客 881

历年蓝桥杯 日期类问题总结

历年蓝桥杯 日期类问题总结 日期类问题 (历年蓝桥杯真题) 发现每年基本上都会有日期处理类的问题, 或者模拟,或者其他,所以就把历年所有日期问题都整理一下吧 输入 1998 输出 1998-2-13 1998-3-13 1998-11-13 题解: 首先是闰年判断 bool isLeap(...

豆子 1135

JAVA 判断一个字符串是不是一个合法的日期格式format.setLenient(false);

在使用 java.text.SimpleDateFormat类 将字符串转换为java.util.Date类对象时, 通常会判断这个字符串是否合法, 也就是说这个表示日期的字符串能否表示一个真正的时间(比如2018/5/32, 显然五月没有32号).如果自己判断的话, 要不就是手动解析字符串来, 比如将年,月,日都取出并判断合法, 但这样并不能一劳永逸, 因为客户端传来的日期格式并不一定只是年月日...

↓ ↓ ↓ ↓ 2460

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1739

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图 画好后效果图 实现代码如下 import matplotlib.pyplot as plt #算法平均排名 _alg_=[1.405,2.643,2.786,2.167] y=[1,2,3,4]#alg1,alg2,alg3,alg4 通过Nemenyi测试计算得到的临界值CD CD=1.024 h_CD=CD/2 plt.figure(figsize=(10,6)) plt.scatter(_alg_,y,s=10

大模型天花板 4464

时间格式化的format.setLenient(false)

在format.setLenient(false) 不开启的情况下 开启format.setLenient(false)  严格控制日期转换,不常规的格式就变成非法的了 format.setLenient(true) 功能关闭

laoyao199044的博客 3291

qemu(2) -- 定制开发板

向qemu源码中添加自定义开发板

xflm的博客 839

Java SimpleDateFormat setLenient用法

SimpleDateFormat.setLenient(true) : 默认值true,不严格解析日期,会自动计算。SimpleDateFormat.setLenient(false):严格解析日期,如果日期不合格就抛异常,不会自动计算。

qq_43842093的博客 1338

晶振匹配电容容值计算方法

在使用晶振时,应仔细参考晶振规格书,以确保正确选择匹配电容,从而获得稳定和精准的时钟源。

aidi1111的博客 4653

GIS应用技巧之三招搞定重叠区域数据提取

在很多分析过程中,常常需要分析判断哪些图形发生了重叠,该重叠情况的发生在对应分析环境下具有特定意义。例如在缓冲区分析中,若两个受灾点周边的受灾面积(即缓冲区)有所重叠,分析重叠区域的受灾影响时,就需要考虑相互影响的因素。本例中先用【要素转面】工具提取出发生重叠的区域,其次用【空间连接】工具将原始图层信息连接到重叠数据的图层,分析重叠数据的属性表,即可得到发生重叠的原始图层数据。 Step1 提取重叠区属数据。打开【数据管理工具】|【要素】|【要素转面】工具,输入要素设置为“circles”,输出要素类设置为

端木宛白的博客家园 6万+

SimpleDateFormat中的setLenient(true/false):自动计算日期

package com.test.date; import java.text.SimpleDateFormat; import java.util.Date; public class TestDate { public static void main(String[] args) { //SimpleDateFormat的setLenient(true) //这种情况下java会把你输入的日...

liunianshishui_的博客 8648

零承诺的启动之路:详解 SAP BTP 的 Pay-As-You-Go for SAP BTP(含案例与迁移策略)

SAP BTP的Pay-As-You-Go(PAYG)模式为零承诺的按需付费方案,适合PoC和小规模上线场景。它提供生产环境直接启用服务的能力,按月后付标准目录价,无预付和折扣。PAYG可与BTP企业协议(BTPEA/CPEA)混合使用,用量稳定后可平滑迁移至CPEA获取更好财务条款。关键优势在于灵活开启/关闭服务,支持通过SAP Discovery Center估算费用,并配合成本治理工具控制支出。该模式适用于创新项目初期,当业务规模可预测时再考虑转为承诺型消费模式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

蓝桥杯AcWing学习笔记 4-2模拟的学习(附相关蓝桥真题:错误票据、移动距离、日期问题、航班时间(1)

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。,我们求的是飞机一趟的飞行时间,因为飞机来回的飞行时间相同,我们可以将来回的飞行时间相加:得到。了,说明该数是重号;本题需要处理的是输入,它只给我们行数,并没有给我们每行的元素是多少,我们不能只用。

2401_84302655的博客 648

1. 迈进 SAP UI5 开发世界的第一步 - Hello World

SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 9001

【LIN总线测试】——LIN主节点数据链路层测试

LIN总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议。其目标定位于车身网络模块节点间的低端通信,主要用于智能传感器和执行器的串行通信,而这正是CAN总线的带宽和功能所不要求的部分。本章节主要介绍LIN主节点数据链路层如何测试?

测试领域技术分享 2610

蓝桥杯2024省赛PythonB组——日期问题

【代码】蓝桥杯2024省赛PythonB组——日期问题。

m0_74917610的博客 481

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

2018届蓝桥杯省赛B组 C++题解(编程题可提交)

第一题:第几天 题目描述 2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容。 答案:125 解题方法: 点击电脑自带计算器 点查看 点日期计算 输出起始日期和终止日期,得出天数 最后天数+1 第二题:明码 答案:387420489 打印的10个汉字为:九的九次方等于多少? 题目描述 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。 16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信

Helinshan的博客 336

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于蓝桥杯,赛前最好搞懂的一些知识(java组)

/ 定义存储Integer类型的动态数组// 定义时直接初始化元素万能导入java.io.*;三行覆盖所有考点,无性能影响。动态数组:用ArrayList替代静态数组,自动扩容,掌握增删查基础操作。排序函数处理数组,处理 List,支持升序 / 降序和指定区间排序。取整运算向上取整,向下取整,直接调用无需手写。数论基础:手写辗转相除法求 GCD,再推导 LCM(先除后乘防溢出);也可使用BigInteger自带方法。位运算技巧。

2503_94385710的博客 563

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

2018年蓝桥杯b组笔记

第一题:第几天 2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天? 这题注意闰年就行 #include<iostream> using namespace std; int main() { cout<< 31 + 29 + 31 + 30 + 4 <<endl; return 0; } 第二题: ...

weixin_53376872的博客 130

C/C++ 日期问题(以蓝桥杯历年真题为例)

具体思路:在原有模板的基础上,将起始遍历年份修改为2014,即从2014年1月1日开始遍历,定义flag来标记天数,当year=2014,month=11,day=9同时满足时,将flag记为1,从2014年11月9日之后,flag就一直等于1了,每次遍历都会++,cnt=1001是因为题目中1月1日过15天之后是1月16日,是走了15个间隔,没有算1月1日当天,由于该段代码是从2014年11月9日当天开始flag就等于1了,因此要当cnt=1001时,再输出那一天的日期。比如:2015-02-19。

oowy_的博客 733

蓝桥杯日期类模板(超详解)

日期类问题可以说是蓝桥杯当中的常客了, 我整理了一下历年真题,归纳出了其中的模板。 希望对你有所帮助。

只想和你一起进步 4944

【蓝桥杯C/C++】专题一:日期问题

在专题一种我们主要讲解关于日期的问题,比较基础但是一定要掌握!!在蓝桥杯竞赛中,常会考到一些日期日历的问题,出现在填空题或者编程的前几题,因此巩固好基础更加有助于我们在比赛中遇到类似的题时游刃有余。下面来枚举一些例题与蓝桥杯的真题。题目—题解—知识点,十分清晰!!废话不多说,先上模板!!以上的题基本包含了所有会考到的日期日历问题,各位一定要先把模板背熟,再去写例题,不会的题一定要好好琢磨题解的思维以及需要掌握的知识点是否已经烂熟于心。开篇大吉,预祝各位考生考出好成绩!!

程序员小火龙的知识分享 1673

蓝桥杯:日期问题

关于这个蓝桥杯的日期问题,其实有一个明确的思路就感觉很简单,这个思路就是不用依照日期的顺序去把每一天走完,而是根据一个数加一,比如说20200204就代表着2020年2月4日,然后让这个数不断地累加,然后每个数去先判断是否为日期,然后再根据题目的要求加一些额外的判断,最后如果条件都满足那么就是要的数,基本上大致的思路都是这样。然后还有一种就是回文日期的问题,然后这类问题就是循环一半,然后用这一半去把整个日期构造出来,然后时间上当然就可以优化很多了,基本就是这样,话不多说,直接看题。

weixin_60033897的博客 967

2017蓝桥杯日期问题(C++B组)

标题:日期问题小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。  比如02/03/04,可能是2002年03月04日、2004年02月...

愿你饱经冷暖,仍保纯真 1017

蓝桥杯 --- 日期问题模板

蓝桥杯竞赛特别喜欢考日期问题,今天给大家分享一下日期题的一些解题模板。

记得开心一点嘛的博客 1432
上一篇: 5.14.树和森林的遍历
下一篇: 1.3.Stream流-Stream流的中间方法
巧克力拌面
博客等级 码龄3年 1153粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值