蓝桥杯(Java) 回文日期
題目描述
2020 年春節(jié)期間,有一個(gè)特殊的日期引起了大家的注意:2020 年 2 月 2 日。因?yàn)槿绻麑⑦@個(gè)日期按 “yyyymmdd” 的格式寫成一個(gè) 8 位數(shù)是 20200202,恰好是一個(gè)回文數(shù)。我們稱這樣的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。對此小明很不認(rèn)同,因?yàn)椴坏?2 年之后就是下一個(gè)回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不僅僅是一個(gè)回文日期,還是一個(gè) ABABBABA 型的回文日期。對此小明也不認(rèn)同,因?yàn)榇蠹s 100 年后就能遇到下一個(gè) ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,頂多算 “千年兩遇”。
給定一個(gè) 8 位數(shù)的日期,請你計(jì)算該日期之后下一個(gè)回文日期和下一個(gè) ABABBABA 型的回文日期各是哪一天。
輸入描述
輸入包含一個(gè)八位整數(shù) NN,表示日期。
對于所有評測用例,10000101≤N≤89991231,保證 N是一個(gè)合法日期的 8 位數(shù)表示。
輸出描述
輸出兩行,每行 1 個(gè)八位數(shù)。第一行表示下一個(gè)回文日期,第二行表示下一個(gè) ABABBABA 型的回文日期。
輸入輸出樣例
示例
輸入 20200202 輸出 20211202 21211212運(yùn)行限制
最大運(yùn)行時(shí)間:1s
最大運(yùn)行內(nèi)存: 256M
解題思路:
①原文鏈接:https://blog.csdn.net/qq_53269123/article/details/123386994
1.首先要滿足回文的形式,即ABCDDCBA,對于回文的判斷用數(shù)組會方便許多。
2.ABABBABA型:此處也可以使用數(shù)組判斷是否是回文型。
3.要滿足日期的格式。
暴力求解思路:預(yù)先存儲好各個(gè)月份的天數(shù)。需要三個(gè)判斷方法:
a.判斷是否是閏年,如果是,則將存儲的二月份的天數(shù)改為29
b.判斷是否是回文型
c.判斷是否是ABAB型
通過三重for循環(huán)來尋找下一次回文日期。巧妙運(yùn)用for循環(huán)的執(zhí)行順序就可以實(shí)現(xiàn)從當(dāng)前日期往后開始尋找。先增加天數(shù),天數(shù)滿了增加月份,月份也滿了增加年份。要注意增加月份和年份時(shí)對應(yīng)地要初始化天數(shù)和月份。通過兩個(gè)Boolean值來判斷是否找到我們的目標(biāo)日期,當(dāng)兩個(gè)Boolean值都為true時(shí)說明都找到了我們的目標(biāo)日期,可以退出循環(huán)了。
import java.util.*; class Main{static boolean IsRun(int y) {if(y%400==0||(y%4==0&&y%100!=0)) return true;return false;}static boolean ABBA(String Str){//判斷回文日期char []str=Str.toCharArray();if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4]) return true;return false;}static boolean ABAB(String Str) {//判斷ABBA型char []str=Str.toCharArray();if(str[0]==str[2]&&str[2]==str[5]&&str[5]==str[7]&&str[1]==str[3]&&str[3]==str[4]&&str[4]==str[6]&&str[0]!=str[1]) return true;return false;}public static void main(String args[]) {int monthes[]={0,31,28,31,30,31,30,31,31,30,31,30,31};Scanner in=new Scanner(System.in);String time=in.next();Integer tt=Integer.parseInt(time);int year=tt/10000;int month=tt%10000/100;int day=tt%100+1;int n;int []ans=new int[2];boolean flag1=false,flag2=false;if(IsRun(year)) monthes[2]=29;for(int i=year;i<=9999;i++,month=1,day=1) {//巧妙運(yùn)用for循環(huán)的順序,可以實(shí)現(xiàn)從當(dāng)前日期開始往后尋找for(int j=month;j<=12;j++,day=1) {for(int k=day;k<=monthes[j];k++) {n=i*10000+j*100+k;String Str=String.valueOf(n);if(ABBA(Str)&&flag1==false) {String str1=Str;flag1=true;ans[0]=n;}if(ABAB(Str)&&flag2==false) {String str2=Str;flag2=true;ans[1]=n;}if(flag1==true&&flag2==true) break;}}}System.out.println(ans[0]);System.out.println(ans[1]);} }②原文鏈接:https://blog.csdn.net/zl202111/article/details/124866084
一、判斷日期是否為合法日期
二、判斷是否是回文日期
三、修改主方法,輸出該日期的第一個(gè)回文日期
四、判斷是否是ABABBABA型回文日期
五、修改主方法,輸出該日期的第一個(gè)ABABBABA型回文日期
六、完整代碼
package net.zwh.lanqiao;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Scanner;public class PalindromicDate {public static void main(String[] args) {String strDate;int year, month, day;Scanner sc = new Scanner(System.in);SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");System.out.print("輸入8位數(shù)構(gòu)成的日期:");strDate = sc.next();if (isLegalDate(strDate)) {System.out.println("[" + strDate + "], 是合法日期~");// 將用戶輸入的合法日期作為日期循環(huán)的起點(diǎn)year = Integer.parseInt(strDate.substring(0, 4));month = Integer.parseInt(strDate.substring(4,6));day = Integer.parseInt(strDate.substring(6));Calendar calendar = Calendar.getInstance();calendar.set(year, month - 1, day);// 任務(wù)1:輸出該日期之后的第一個(gè)回文日期String strDate1 =strDate;Calendar calendar1 = calendar;while (true) {calendar1.add(Calendar.DAY_OF_MONTH, 1); // 往后推1天strDate1 = sdf.format(calendar1.getTime());if(isPalindromicDate(strDate1)) {break; // 找到1個(gè)回文日期就跳出循環(huán)}}System.out.println("該日期之后的第一個(gè)回文日期:【" + strDate1 + "】" );// 任務(wù)2:輸出該日期之后的第一個(gè)ABABBABA回文日期String strDate2 =strDate;Calendar calendar2 = calendar;while (true) {calendar2.add(Calendar.DAY_OF_MONTH, 1); // 往后推1天strDate2 = sdf.format(calendar2.getTime());if(isABABBABAPalindromicDate(strDate2)) {break; // 找到1個(gè)回文日期就跳出循環(huán)}}System.out.println("該日期之后的第一個(gè)ABABBABA回文日期:【" + strDate2 + "】" );} else {System.out.println("[" + strDate + "], 是非法日期~");}}/*** 判斷日期是否合法* @param strDate* @return true-合法,false-非法*/public static boolean isLegalDate(String strDate) {int year, month, day;year = Integer.parseInt(strDate.substring(0, 4));month = Integer.parseInt(strDate.substring(4,6));day = Integer.parseInt(strDate.substring(6));// 利用反向思維來處理if (year < 1000 || year > 8999) return false;if (month < 1 || month > 12) return false;if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {if (day < 1 || day > 31) return false;} else if (month == 2){if (year % 4 == 0 && year %100 != 0 || year % 400 == 0 ) { // 閏年判斷if(day < 1 || day > 29) return false;}else {if(day < 1 || day > 28) return false;}} else {if (day < 1 || day > 30) return false;}return true;}/*** 判斷是否是回文日期* @param strDate* @return true-回文日期, false-非回文日期*/private static boolean isPalindromicDate(String strDate) {for (int i = 0; i < 4; i++) {// 采用反向思維if (strDate.charAt(i) != strDate.charAt(7-i)) return false;}return true;}/*** 判斷是否是ABABBABA型回文日期** @param strDate* @return*/private static boolean isABABBABAPalindromicDate(String strDate) {if (isPalindromicDate(strDate)) {if (strDate.charAt(0) == strDate.charAt(2) && strDate.charAt(1) == strDate.charAt(3)) return true;}return false;} }自己寫的錯(cuò)誤的:
import java.util.Scanner; public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int a[] = new int[8];for(int i = N+1;i<=8991231;i++) {for(int j = 0;j<8;j++) {//將日期每位數(shù)放入數(shù)組a[j] = N%10;N/=10;}if(run(i)&&b(i,a)&&f(a)) {System.out.println(i);}}}public static boolean run(int n) {//判斷閏年、考慮二月天數(shù)if((n%4==0&&n%100!=0)||n%400==0) {return true;}return false;}public static boolean b(int n,int a[]) {//判斷合法if(1<=a[2]+a[3]*10&&a[2]+a[3]*10<=12) {//如果月份合法if(a[0]+a[1]*10>=1&&a[0]+a[1]*10<=31) {//如果日期合法if(run(n)) {//如果閏年二月29天if(a[3]==2){if(a[0]+a[1]*10>=1&&a[0]+a[1]*10<=29) {return true;}return false;}}return true;}}return false;}public static boolean f(int a[]) {//判斷回文if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]) {return true;}return false;}/*int N = sc.nextInt();int a[] = new int[8];int x = 0;int y = 0;for(int i = N+1;i<=8991231;i++) {int l = i;int z =i;for(int j = 0;j<8;j++) {a[j] = l%10;l/=10;}if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]) {System.out.print(z); //x = l;}//if(a[0]==a[2]&&a[0]==a[5]&&a[0]==a[7]&&a[2]==a[5]&&a[2]==a[7]&&a[5]==a[7]&&a[1]==a[3]&&a[1]==a[4]&&a[1]==a[6]&&a[3]==a[4]&&a[3]==a[6]&&a[4]==a[6]) {//y = i;//}}//System.out.print(y);*/}總結(jié)
以上是生活随笔為你收集整理的蓝桥杯(Java) 回文日期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python打擂台法_一起来捉妖:这种打
- 下一篇: java美元兑换,(Java实现) 美元