AcWing1229.日期问题——学习笔记

news2024/11/13 22:25:36

目录

题目

代码

AC结果

思路: 

一、获取数据

二、验证日期合法性

三、去重

四、排序

五、主方法中调用&输出


题目

1229. 日期问题 - AcWing题库icon-default.png?t=MBR7https://www.acwing.com/problem/content/description/1231/


代码


import java.util.Scanner;

public class Main {

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String[] str = input.nextLine().split("\\/");
        int value0 = Integer.parseInt(str[0]);
        int value1 = Integer.parseInt(str[1]);
        int value2 = Integer.parseInt(str[2]);
        String[] ans = new String[3];

        //0:年 1:月 2:日
        if(check(value0,value1,value2)){
            if(value0 >= 60){
                ans[0] = "19" + str[0] + "-" + str[1] + "-" + str[2];
            }else {
                ans[0] = "20" + str[0] + "-" + str[1] + "-" + str[2];
            }
        }else {
            ans[0] = "false";
        }
        //0:月 1:日 2:年
        if(check(value2,value0,value1)){
            if(value2 >= 60){
                ans[1] = "19" + str[2] + "-" + str[0] + "-" + str[1];
            }else {
                ans[1] = "20" + str[2] + "-" + str[0] + "-" + str[1];
            }
        }else {
            ans[1] = "false";
        }
        //0:日 1:月 2:年
        if(check(value2,value1,value0)){
            if (value2 >= 60){
                ans[2] = "19" + str[2] + "-" + str[1] + "-" + str[0];
            }else {
                ans[2] = "20" + str[2] + "-" + str[1] + "-" + str[0];
            }

        }else {
            ans[2] = "false";
        }

        distinct(ans);
        rank(ans);

        //输出
        for(int i = 0; i < ans.length; i++){
            if(ans[i] == "false"){
                continue;
            }
            System.out.println(ans[i]);
        }
    }

    //排序
    public static void rank(String[] ans){
        String temp = "";

        //年排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if (Integer.parseInt(ans[i].substring(0,4)) > Integer.parseInt(ans[j].substring(0,4))){
                    temp = ans[i];
                    ans[i] = ans[j];
                    ans[j] = temp;
                }
            }
        }

        //月排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if(Integer.parseInt(ans[i].substring(5,7)) > Integer.parseInt(ans[j].substring(5,7))){
                    if(Integer.parseInt(ans[i].substring(0,4)) == Integer.parseInt(ans[j].substring(0,4))){
                        temp = ans[i];
                        ans[i] = ans[j];
                        ans[j] = temp;
                    }
                }
            }
        }
        //日排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if(Integer.parseInt(ans[i].substring(8,10)) > Integer.parseInt(ans[j].substring(8,10))){
                    if(Integer.parseInt(ans[i].substring(0,4)) == Integer.parseInt(ans[j].substring(0,4)) && Integer.parseInt(ans[i].substring(5,7)) == Integer.parseInt(ans[j].substring(5,7))){
                        temp = ans[i];
                        ans[i] = ans[j];
                        ans[j] = temp;
                    }
                }
            }
        }
    }

    //数值合法性
    public static boolean check(int year,int month,int day){
        //数据合法性
        if(month == 0 || day == 0 || month > 12 || day > 31) {
            return false;
        }
        boolean isLeapYear = year % 4 == 0;
        if(month <= 7 && month % 2 == 1 || month > 7 && month % 2 == 0){//判断大月
            if(day > 31){
                return false;
            }
        }else if(month <= 7 && month % 2 == 0 || month > 7 && month % 2 == 1){//判断小月
            if(month == 2){//判断闰年&平年的2月
                if (isLeapYear){
                    if(day > 29){
                        return false;
                    }
                } else if (!isLeapYear){
                    if (day > 28){
                        return false;
                    }
                }
            }else if(day > 30){
                return false;
            }
        }

        return true;
    }

    //去重
    public static void distinct(String[] ans){
        ans[0] = ans[0].equals(ans[1]) ? "false" : ans[0];
        ans[0] = ans[0].equals(ans[2]) ? "false" : ans[0];
        ans[1] = ans[1].equals(ans[2]) ? "false" : ans[1];
    }
}

AC结果


思路: 

这题整体思路并不难,就是需要考虑周全。题目意思是输入一个A/B/C格式的日期,然后输出其可能表示的日期。有可能是A年B月C日、C年A月B日、C年B月A日三种可能性。除此之外,还需要对他们的数值进行判断,确保生成的是一个合法的正常的日期。然后对答案进行去重排序,即可输出。

一、获取数据


        Scanner input = new Scanner(System.in);
        String[] str = input.nextLine().split("\\/");
        int value0 = Integer.parseInt(str[0]);
        int value1 = Integer.parseInt(str[1]);
        int value2 = Integer.parseInt(str[2]);
        String[] ans = new String[3];

题目输入格式为“A/B/C”,所以我们就以【斜杠】为分界,将三个数据分别存入value0、value1、value2三个int类型的变量之中。String类型数组ans用于存储生成的日期。

二、验证日期合法性

    //数值合法性
    public static boolean check(int year,int month,int day){
        //数据合法性
        if(month == 0 || day == 0 || month > 12 || day > 31) {
            return false;
        }
        boolean isLeapYear = year % 4 == 0;
        if(month <= 7 && month % 2 == 1 || month > 7 && month % 2 == 0){//判断大月
            if(day > 31){
                return false;
            }
        }else if(month <= 7 && month % 2 == 0 || month > 7 && month % 2 == 1){//判断小月
            if(month == 2){//判断闰年&平年的2月
                if (isLeapYear){
                    if(day > 29){
                        return false;
                    }
                } else if (!isLeapYear){
                    if (day > 28){
                        return false;
                    }
                }
            }else if(day > 30){
                return false;
            }
        }

        return true;
    }

这个方法是用于对生成的日期进行合法性判断。此处不需要对“年”进行验证,后面会详说。这里只需要对月份和日期进行合法性验证。

规则:

【1】“月”和“日”不可以为0

【2】“月”不可以大于12

【3】“日”不可大于31(具体月份后续具体分析,但是超过31就必定是不合法的)

【4】1、3、5、7、8、10、12月的“日”不大于31

【5】4、6、9、11月的“日”不大于30

【6】2月的“日”,闰年为29,平年不大于28

简而言之,就是月份符合小学时候学的“拳峰特点”。年份对4取余,观察结果是否为0,若是则为闰年,否则为平年。上述各个条件,但凡有一个不满足,就返回false。若都满足,则这个生成的日期是合法的,返回true。

三、去重

    //去重
    public static void distinct(String[] ans){
        ans[0] = ans[0].equals(ans[1]) ? "false" : ans[0];
        ans[0] = ans[0].equals(ans[2]) ? "false" : ans[0];
        ans[1] = ans[1].equals(ans[2]) ? "false" : ans[1];
    }

因为生成的日期最多有三个。用第一个日期与第二第三个日期进行比对,是否相同,若相同则将第一个日期替换为字符串“false”。然后,用第二个日期与第三个日期进行比对,相同也是同样处理。替换为“false”的意思是,将其变为不合法的状态。

四、排序

    //排序
    public static void rank(String[] ans){
        String temp = "";

        //年排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if (Integer.parseInt(ans[i].substring(0,4)) > Integer.parseInt(ans[j].substring(0,4))){
                    temp = ans[i];
                    ans[i] = ans[j];
                    ans[j] = temp;
                }
            }
        }

        //月排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if(Integer.parseInt(ans[i].substring(5,7)) > Integer.parseInt(ans[j].substring(5,7))){
                    if(Integer.parseInt(ans[i].substring(0,4)) == Integer.parseInt(ans[j].substring(0,4))){
                        temp = ans[i];
                        ans[i] = ans[j];
                        ans[j] = temp;
                    }
                }
            }
        }
        //日排序
        for(int i = 0; i < ans.length - 1; i++){
            for(int j = i + 1; j < ans.length; j++){
                if(ans[i] == "false" || ans[j] == "false"){
                    continue;
                }else if(Integer.parseInt(ans[i].substring(8,10)) > Integer.parseInt(ans[j].substring(8,10))){
                    if(Integer.parseInt(ans[i].substring(0,4)) == Integer.parseInt(ans[j].substring(0,4)) && Integer.parseInt(ans[i].substring(5,7)) == Integer.parseInt(ans[j].substring(5,7))){
                        temp = ans[i];
                        ans[i] = ans[j];
                        ans[j] = temp;
                    }
                }
            }
        }
    }

遍历ans二维数组,依次进行年排序、月排序和日排序。优先进行“年”的排序,将年份按大小的排列好。此时再进行月排序,排序前需要对两个待排序的日期的年份进行判断。如果年份不同,则不需要进行换位操作;如果年份一样,就可以进行换位操作。日排序也是同样的道理,需要年份和月份都相同的时候再对日期进行排序。

五、主方法中调用&输出

        //0:年 1:月 2:日
        if(check(value0,value1,value2)){
            if(value0 >= 60){
                ans[0] = "19" + str[0] + "-" + str[1] + "-" + str[2];
            }else {
                ans[0] = "20" + str[0] + "-" + str[1] + "-" + str[2];
            }
        }else {
            ans[0] = "false";
        }
        //0:月 1:日 2:年
        if(check(value2,value0,value1)){
            if(value2 >= 60){
                ans[1] = "19" + str[2] + "-" + str[0] + "-" + str[1];
            }else {
                ans[1] = "20" + str[2] + "-" + str[0] + "-" + str[1];
            }
        }else {
            ans[1] = "false";
        }
        //0:日 1:月 2:年
        if(check(value2,value1,value0)){
            if (value2 >= 60){
                ans[2] = "19" + str[2] + "-" + str[1] + "-" + str[0];
            }else {
                ans[2] = "20" + str[2] + "-" + str[1] + "-" + str[0];
            }

        }else {
            ans[2] = "false";
        }

        distinct(ans);
        rank(ans);

        //输出
        for(int i = 0; i < ans.length; i++){
            if(ans[i] == "false"){
                continue;
            }
            System.out.println(ans[i]);
        }

在主方法中按规则分别枚举每种情况(例如:输入为“02/03/04”,枚举出来02年3月4日、04年2月3日、04年3月2日三种情况)。然后此处需要对年份作单独的判断,由题目可知日期的有效时间段在1960-2059。那意味着题目输入的任意一个年份都是合法的,但是需要判断是20世纪还是21世纪。当年份为[60,99]在是20世纪,当年份为[0,59]则表示在21世纪。对生成的日期调用check方法检验合法性,若合法则将生成的日期存入ans对应位置,年月日之间用“-”链接。否则,将字符串“false”传入ans当前对应位置,表示该个生成的日期不合法。

得到的结果存入ans数组中,然后遍历ans数组,如果是“false”就跳过当前,如果不是那就输出对应生成的日期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XILINX FPGA OV5640 摄像头驱动(一)

影像行业是一个值得深耕的方向&#xff0c;废话不多说 先看输入和输出 输入是光照&#xff0c;输出是光照的数字信号 image area&#xff1a;说的是感光矩阵&#xff0c;CMOS图像传感器的最核心部分&#xff0c;接收光照产生电信号的部分。决定了图像质量的好坏 矩阵就会行列…

MyBatisPlus笔记

一、MyBatisPlus概述 MyBatisPlus&#xff08;简称 MP&#xff09;是一个MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 MyBatis-Plus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成&…

leetcode1143 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;…

因果诊断原理

因果分析在近十来年逐渐倍受关注&#xff0c;其提供了解释因子间因果性的定量分析工具&#xff0c;广泛用于数据分析领域&#xff0c;同时也就用决策分析、作用预估等反事实因果推理中。本文首先对比了因果性和相关性的关系&#xff0c;之后确定因果关系的基本方法&#xff0c;…

博客搭建教程1-Archlinux环境配置

文章目录1 前言2 archlinux镜像下载3 archlinux安装1 前言 这个教程主要讲解linux环境下博客的搭建&#xff0c;这里的linux系统选择archlinux&#xff0c;博客的框架基于hexo框架。 参考博客&#xff1a; 1、ArchLinux安装教程 2、Archlinux2022年7月镜像 手把手安装教程 UE…

MySQL进阶——存储过程

MySQL 存储过程 1、简介 大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作需要多条语句才能完成。 存储过程简单来说&#xff0c;就是为以后的使用而保存的一条或多条 MySQL 语句的集合。可将其视为批处理文件。虽然他们的…

【Spring(八)】带你打通Spring的注解开发

文章目录注解开发注解开发定义bean纯注解开发注解开发bean作用范围与生命周期管理注解开发依赖注入注解开发管理第三方bean注解开发实现为第三方bean注入资源总结注解开发 Spring的配置我们已经告一段落了&#xff0c;那接下来我们就要发挥Spring的强项了&#xff1a;简化开发&…

MySQL —— 数据库基础

目录 一、数据库的基本概念 1. 什么是数据库 2. 主流的数据库 二、基本使用 1. 连接服务器 2. 服务器管理 3. 服务器、数据库、表关系 4. 使用案例 5. 数据库的存储逻辑 三、MySQL架构 四、SQL分类 五、存储引擎 1. 存储引擎 2. 查看存储引擎 3. 存储引擎对比 …

Elasticsearch 这篇还不够吗

系列文章目录 文章目录系列文章目录一、概述1. ES 的基本概念2. ES 和关系型数据库的对比二、环境准备1. linux 下单机安装三、入门操作1. 创建索引2. 写入文档3. 根据id搜索文档4. 根据一般字段搜索文档5. 根据文本字段搜索文档四、ES 客户端实战1. Spring Data Elasticsearch…

学习shell与shell编程 vi与vim

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

webgl纹理贴图机制

文章目录前言纹理图片大小规范纹理坐标系统贴图流程JavaScript部分齐次坐标—uv坐标数据准备加载外部纹理图像纹理配置加载着色器部分顶点着色器片元着色器完整示例使用多张纹理着色器接受两个纹理单元封装纹理配置赋值函数完整示例总结前言 在计算机图形学中&#xff0c;为了…

HTML+CSS+JS制作炫酷【烟花特效】

文章目录制作炫酷烟花特效一、普通烟花(分散形)HTML代码CSS代码JS代码二、圆形烟花HTML代码CSS代码JS代码三、爱心形烟花HTML代码CSS代码JS代码四、源码获取在线下载制作炫酷烟花特效 &#x1f4a1;本篇内容使用htmlcssjs制作鼠标点击出现烟花效果&#xff0c;分别介绍了分散型…

python-测试代码

1. 测试函数get_name.pydef combination(first, last):将姓名组合在一起name first lastreturn name.title()hello_world.pyfrom get_name import combinationprint("Enter q to quit!") while True:first input(Please input your first name: )if first q:b…

理光Aficio MP C2500扫描到文件夹设置方法

首先在需要接收扫描文件的电脑上设置共享文件夹。 注&#xff1a; &#xff08;1&#xff09;文件夹的名字最好简单一点&#xff0c;比如&#xff1a;scan、123等等&#xff1b; &#xff08;2&#xff09;文件夹的共享权限最好能设置为最大&#xff08;WindowsXP、Windows200…

Future、CompletableFuture概述

1.同步和异步 &#xff08;1&#xff09;同步&#xff1a;需要等待结果返回&#xff0c;才能继续运行 &#xff08;2&#xff09;异步&#xff1a;不需要等待结果返回&#xff0c;就能继续运行 &#xff08;3&#xff09;异步设计&#xff1a;多线程可以让方法执行变为异步(比…

第四章必备前端基础知识-第二节3:CSS盒模型和浮动

文章目录一&#xff1a;盒模型&#xff08;1&#xff09;border&#xff08;2&#xff09;padding&#xff08;3&#xff09;margin二&#xff1a;flex布局一&#xff1a;盒模型 盒模型&#xff1a;在HTML中&#xff0c;每个标签&#xff08;或元素&#xff09;相当于是一个盒…

Mybatis和Jpa

这里写目录标题1.Mybatis1.1 JDBC的缺点1.2 Mybatis的整体架构1.3 入门案例1.3.1 问题:无法连接到数据库服务器1.4 动态代理实现Mapper1.5 mybatis-config.xml配置1.5.1 properties属性读取外部资源1.5.2 settings设置1.5.3 typeAliases1.5.4 typeHandlers&#xff08;类型处理…

【Substance Designer】基础操作和节点学习记录

写在前面 这个记录稍微有点杂&#xff0c;大概是庄懂的技术美术入门课(美术向)-直播录屏-第20课和一些基础操作的记录合集吧&#xff01; 补充 学习发现&#xff0c;基础的节点是需要学习和记录的&#xff0c;但是真正用起来还是要多用多练&#xff01;所以这种简单的记录节点…

YOLOv5/v7 引入 RepVGG 重参数化模块

本篇博文代码出自YOLOv5-lite &#xff0c;YOLOv5-lite的作者在CSDN的账号是 pogg_ &#xff0c;大家可以关注一下&#xff0c;这也是一位在开源项目上做了很多工作的博主。 RepVGG的原理和融合推导过程可以看我的这篇博文&#xff1a;RepVGG&#xff1a;让VGG风格的ConvNets再…

机制设计原理与应用(三)Screening

文章目录3 Screening3.1 为单个不可分割的项目定价3.1.1 对θ\thetaθ的假设3.1.2 问题描述3.1.3 特性3.2 为无限可分的项目定价3.2.1 对θ\thetaθ的假设3.2.3 特性3.2.4 收益最大化3.2.5 最优解决方案3 Screening Screening theory&#xff1a;机制设计理论可以被看作是其多…