回文日期 (蓝桥云) JAVA

这篇具有很好参考价值的文章主要介绍了回文日期 (蓝桥云) JAVA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述:

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd”
的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即
2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100
年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算
“千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述:

输入包含一个八位整数 N,表示日期。

对于所有评测用例,
10000101 ≤ 89991231
N 是一个合法日期的 8 位数表示。

输出描述:

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例:

输入

20200202

输出

20211202
21211212


统领:

第一次参加蓝桥杯,所以今天才知道蓝桥杯采用oi机制,即提交后没有任何反馈,这给我的冲击很大,因为我平常写完代码,第一时间是去平台测试,根据平台反馈,找错误原因,而蓝桥杯的赛制,直接让我的这个习惯成为了最大破绽。失去了通过平台找错因的手段,让我备受打击,抱着从头再来的想法。我在蓝桥云找了一道适合我水平的题目,试试一遍能得多少分。
好在这一次侥幸能够全部AC给我带来了一丝希望,以下是通过题目总结我的心得。


本题完整代码:

import java.util.*;
public class Main {
   public static  int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   public static void main(String[] args) {
	   Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int yy = n / 10000;
       //System.out.println(yy);
       while(true) {
    	   if(check(yy)) {
    		   StringBuffer s = new StringBuffer(String.valueOf(yy));
    		   String s1 = String.valueOf(yy);
    		   s1 = s1 + s.reverse();
    		   if(Integer.parseInt(s1) > n) {
    		     System.out.println(s1);
    		     break;
    		   }
    	   }
    	   yy  = yy + 1;
       }
       int YY = n / 1000000;
       while(true) {
    	   if(check_y(YY)) {
    		   StringBuffer s2 = new StringBuffer(String.valueOf(YY * 100 + YY));
    		   String s3 = String.valueOf(YY * 100 + YY) + s2.reverse();
    		   if(Integer.parseInt(s3) > n) {
    		     System.out.print(s3);
    		     break;
    		   }
    	   }
    	   YY = YY + 1;
       }
   }
   public static boolean check_y(int m) {
	   int yy = m * 100 + m;
	   if(yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0) {
		   month[2] = 29;
	   }
	   else month[2] = 28;
	   StringBuffer s = new StringBuffer(String.valueOf(yy));
	   String s1 = "" + s.reverse();
	   int mm = Integer.parseInt(s1.substring(0, 2));
	   int dd = Integer.parseInt(s1.substring(2, 4));
	   //System.out.println(month[2]);
	   if(mm <= 0 || mm > 12) return false;
	   if(month[mm] < dd) return false;
	   return true;
   }
   public static boolean check(int n) {
	   int yy = n;
	   if(yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0) {
		   month[2] = 29;
	   }
	   StringBuffer s = new StringBuffer(String.valueOf(yy));
	   String s1 = "" + s.reverse();
	   int mm = Integer.parseInt(s1.substring(0, 2));
	   int dd = Integer.parseInt(s1.substring(2, 4));
	   //System.out.println(month[2]);
	   if(mm <= 0 || mm > 12) return false;
	   if(month[mm] < dd) return false;
	   return true;
   }
}

心得:

蓝桥杯是提交没有反馈的,所以我们得细心细心再细心,不要图快,急着把做后面的题。我导师跟我说一个大哥,去年参赛国二,卷了一年再考蓝桥杯只得了省三。问题不在于他题不会,他是所有题都做了。可想而知,他做的题可能只能通过题目给的样例,而样例又不算分数。所以为了能稳定发挥吧,我对自己的建议是:

1.反复斟酌题目要求:

如果你有一道题是会做的,程序也写出来了,那就要务必保证其能对尽可能多的测试点,题目一定要多读几遍,就拿上述题目来举例子,题目要求输出该日期之后的下一个回文日期,假若你没注意到这一点,那么当N = 20201221时,你的程序输出的可能就是20200202这个输出显然不是正确答案

2.小心谨慎步步为营,多反问:

首先我们应该问自己所有的八位回文数字串都行么?

显然回文日期的月份和天数都得合法才行,即月份应在[0, 12], 天数应该在当月的范围内

再思考到当月的天数范围,我们就意识到了,还得判断这个年是闰年还是平年,这样二月的天数范围我们就明确了

考虑到上述问题后,我们的正确率就提高了,然后就是构思去实现一个check函数判断我们的回文日期是否合法:

public static boolean check(int n) {
	   int yy = n;
	   if(yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0) {
		   month[2] = 29;
	   }
	   StringBuffer s = new StringBuffer(String.valueOf(yy));
	   String s1 = "" + s.reverse();
	   int mm = Integer.parseInt(s1.substring(0, 2));
	   int dd = Integer.parseInt(s1.substring(2, 4));
	   //System.out.println(month[2]);
	   if(mm <= 0 || mm > 12) return false;
	   if(month[mm] < dd) return false;
	   return true;
   }
}

写完check后我们不要急着走,我们应该及时检查这个check函数是否正确,多想几个样例测试一下,确保无误后再继续进行。这样如果整个代码出现问题,至少我们能排除check代码的问题,这就是步步为营。

3.调节代码之间的关系:

那本题为例输出有两个一个是回文日期,一个是ABABBABA型回文,这里就存在一个问题,如果前者输出回文日期,判断的年份刚好是闰年,我们修改了month[2] = 29而下一个这个ABABBABA型日期刚好是平年,这里就容易出问题了。

所以为了解决这个问题,实现ABABBABA型的代码就需要调整了。

 if(yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0) {
		   month[2] = 29;
	   }
	   else month[2] = 28;

如上图我添加了一个else语句,这样代码的正确率又会提高。


总结:

要想用代码去实现一道题目,我们需要把这其中很难多问题分块解决,并用代码去解决。个人亲身体会,去解决这些块问题,要比分析边界要花费的时间更多。所以如果我们写出代码后直接潦草提交,就有可能会因为其中的细节没考虑到而功亏一篑。既然我们已经投入了这么多时间去用编程解决这道题,那么为何不愿多花点时间找出可能的边界,得到更多的分数?显然有时候是我太贪心了,分不清西瓜和芝麻。

想想也是没必要抱怨,能够自己排除bug,分析可能的错因,写出优质代码,让用户有更好的体验。何尝不是一个合格程序员该具备的?😄

利用余下的时间我会继续依靠采用这种一遍过的模式做题,适应oi赛制。文章来源地址https://www.toymoban.com/news/detail-403348.html

到了这里,关于回文日期 (蓝桥云) JAVA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥 13期 java c组 特殊日期

    【问题描述】         2022 年 2 月 22 日 22:20 是一个很有意义的时间,年份为 2022,由 3 个 2 和 1 个 0 组 成,如果将月和日写成 4 位,为 0222,也是由 3 个 2 和 1 个 0 组 成,如果将时间中的时和 分写成 4 位,还是由 3 个 2 和 1 个 0 组成。          小蓝对这样的时间很感兴趣

    2024年02月14日
    浏览(34)
  • 【蓝桥杯】1434:回文数字—>三种判断回文的方法

    通过对蓝桥杯真题回文数字的讲解,引出关于三种回文判断的方式: 数组或字符串 、 栈 、 直接反转数字 。 目录 前言: 蓝桥杯题目:回文数字 题目分析: 一、数组或字符串判断回文: 二、利用栈的数据结构判断回文: 三、直接反转数字 观察数字:12321,123321  都有一个

    2024年02月09日
    浏览(39)
  • 蓝桥杯求解回文数(栈求解版本)

    堆栈构造输出方法求解 问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。 输出格式 按从小到大的顺序输出满足条件的四位十进制数。

    2024年01月22日
    浏览(45)
  • 蓝桥杯官网练习题(三角回文数)

    问题描述 对于正整数 n, 如果存在正整数 k 使得n=1+2+3+⋯+k=(k(k+1)/2)​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066=1+2+3+⋯+363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。例如, 66066 是一个回

    2024年02月09日
    浏览(47)
  • 【蓝桥杯冲刺】日期类专题特训

    目录 1. 日期累加 题目描述 输入 输出 代码 2. 日期差值 题目描述 输入 输出 代码 3. 打印日期 题目描述 输入 输出 代码 写在最后: 题目链接: 日期累加 输入 输出 题目链接:日期差值 输入 输出 题目链接:打印日期 输入 输出 日期类的题目大同小异, 把日期类的基本思路练

    2023年04月16日
    浏览(43)
  • leetcode 516. 最长回文子序列(JAVA)题解

    题目链接 https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_source=LCUSutm_medium=ip_redirectutm_campaign=transfer2china 目录 题目描述: 暴力递归: 动态规划: 给你一个字符串  s  ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况

    2024年02月13日
    浏览(44)
  • 【刷题1】LeetCode 131. 分割回文串 java题解

    2024: 刚开始做leetcode hot100,查阅自己以前写的题解专栏,发现没有这一题,于是加上。可能leetcode100更新了吧。我看现在leetcode100官网的题目已经是分好类的了,以前我的题解帖子是自己手动分类整理的。

    2024年02月19日
    浏览(42)
  • Java 判断一个数是否是回文数(parlindrome)

    回文数 :从左往右读和从右往左读完全相同的数,如121、12321是回文数,12345不是。 思路 :分别获取到原数字的每一位,反过来组成一个新的数,和原数字比较,若相同则是回文数。 代码 : 关键 : %10获取最后一位,之后将数字/10来去掉这一位,如123%10,得到最后一位3,之

    2024年04月12日
    浏览(55)
  • 字符串后面补最短长度的字符,使其整体成回文字符串(java)

    给定一个字符串str,只能在str的后面添加字符,想让str整体变成回文串,返回至少要添加几个字符 首先介绍下manacher 算法: Manacher 算法是一种线性时间复杂度的求解最长回文子串的算法。它的核心思想是利用已知回文信息,避免重复计算。 Manacher 算法的基本思想是通过预处

    2024年02月16日
    浏览(38)
  • 【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

    标签(题目类型):回文串、动态规划 原题:LeetCode 5 思路 Dynamic Programming(DP) 动态规划是一种将问题分解成子问题并分别计算的优化技术。对于回文子串,我们可以使用动态规划来解决。 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后

    2024年04月14日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包