Java实现输出ABABBABA型回文日期

输入一个合法的日期例如:20191212
输出在此之后的所有合法的ABABBABA型日期

输入10000101

输出第一行:10011001
第二行:10100101
第一行为最近一个普通的回文日期,第二行为ABAB型回文日期

package 回顾练习蓝桥杯;

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	int date = sc.nextInt();
	System.out.println(f(date));
	System.out.println(p(date));

}

private static String p(int date) {
	int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	int a1 = date/10000;
	int a2 = date/100%100;
	int a3 = date%100;
	String s = new String();
	if (a1%4==0&&a1%100!=0||a1%400==0) {//处理一下闰年的问题
		a[2]=29;
	}
	jj:for (int i = a1; i <= 9999; i++) {
		for (int j = 1; j <= 12; j++) {
			for (int k = 1; k <= a[j]; k++) {
				String string = check(i,j,k);
				int q1 = fen(string,0);//A
				int q2 = fen(string,1);
				int q3 = fen(string,2);//A
				int q4 = fen(string,3);
				int q5 = fen(string,4);
				int q6 = fen(string,5);//A
				int q7 = fen(string,6);
				int q8 = fen(string,7);//A
				if (q1==q3&&q3==q6&&q6==q8&&q2==q4&&q4==q5&&q5==q7) {
					s = string;
					break jj;
				}
			}
		}
	}
	return s;
}

private static int fen(String string, int i) {
	return Integer.parseInt(string.substring(i,i+1));
}

private static String check(int i, int j, int k) {
	if (j<10&&k<10) {
		return ""+i+0+j+0+k;
	}else if (j<10&&k>=10) {
		return ""+i+0+j+k;
	}else if (j>=10&&k<10) {
		return ""+i+j+0+k;
	}else {
		return ""+i+j+k;

	}
}

private static String f(int date) {
		int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		int a1 = date/10000;
		int a2 = date/100%100;
		int a3 = date%100;
		String s = new String();
		if (a1%4==0&&a1%100!=0||a1%400==0) {//处理一下闰年的问题
			a[2]=29;
		}
		jj:for (int i = a1; i <= 9999; i++) {
			for (int j = 1; j <= 12; j++) {
				for (int k = 1; k <= a[j]; k++) {
					String string = check(i,j,k);
					int q1 = fen(string,0);
					int q2 = fen(string,1);
					int q3 = fen(string,2);
					int q4 = fen(string,3);
					int q5 = fen(string,4);
					int q6 = fen(string,5);
					int q7 = fen(string,6);
					int q8 = fen(string,7);
					if (q4==q5&&q3==q6&q2==q7&&q1==q8) {
						s = string;
						break jj;
					}
				}
			}
		}
		return s;
	}
}

### 关于蓝桥杯竞赛中的回文数组问题 #### 解题思路 对于涉及回文数组的问题,核心在于理解回文的概念及其特性。回文是指正读和反读都相同的字符串或数字序列。针对给定的输入日期,目标是找到符合条件的下一个回文日期以及特定模式下的回文日期。 为了实现这一功能,可以采用如下策略: - **解析输入**:将输入的8位整数转换成易于操作的形式。 - **生成候选者**:基于当前日期逐步增加天数直到发现新的回文日期为止;对于ABABBABA回文,则需特别构建满足该模式的日历格式并验证其有效性。 - **校验条件**:确保所选日期确实构成有效的公历年份,并且符合题目要求的具体形式。 - **返回结果**:按照指定格式输出两个不同的回文日期作为最终答案[^4]。 下面是具体的Java代码示例用于解决上述提到的任务: ```java import java.util.*; public class PalindromeDate { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); // 将输入转化为容易处理的形式 Date date = parse(input); // 查找下一个普通的回文日期 while (!isPalindrome(date.toString())) { date = nextDay(date); } System.out.println(date.format()); // 查找下一个特殊模式(ABABBABA)的回文日期 do { date = nextDay(date); } while (!(isValidSpecialPattern(date))); System.out.println(date.format()); } private static boolean isPalindrome(String s){ int n=s.length(); for(int i=0;i<n/2;++i){ if(s.charAt(i)!=s.charAt(n-i-1)){ return false; } } return true; } private static boolean isValidSpecialPattern(Date d){ String str=d.toString(); char a=str.charAt(0),b=str.charAt(1); return Arrays.equals(str.toCharArray(),new char[]{a,b,a,b,b,a,b,a}); } // 假设存在这样的类来简化逻辑, 实际应用中需要具体实现这些方法. private static Date parse(String dateString){...} private static Date nextDay(Date currentDate){...} } class Date{ private final int year; private final int month; private final int day; public Date(int y,int m ,int d){ this.year=y; this.month=m; this.day=d; } @Override public String toString(){ return String.format("%d%02d%02d",year,month,day); } public String format(){ return String.format("%d-%02d-%02d",year,month,day); } // ...其他必要的成员函数... } ``` 此段程序展示了如何通过不断迭代每一天的方式去查找最近的一个普通回文日以及具有`ABABBABA`结构特征的日子。需要注意的是,在实际编码过程中还需要考虑闰年等因素的影响以保证算法准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值