解题思路:
为了解决这个问题,我们需要根据输入的日期格式 "AA/BB/CC" 判断所有可能的日期,并将其输出为 "yyyy-MM-dd" 格式。
我们需要考虑以下几点:
1. **年份的解析**: - 对于年份 "AA",如果 AA >= 60,则视为 19AA;如果 AA < 60,则视为 20AA。
2. **日期的解析**: - 输入的日期可以有三种解释方式: - 年/日/月 - 月/日/年 - 日/月/年
3. **日期的有效性**:
- 需要确保生成的日期在1960年到2059年之间,并且日期是有效的。
注意事项:
1.**日期格式化**:将合法日期格式化为 "yyyy-MM-dd" 并存入集合中以去重。
2. **输出结果**:将集合中的日期按升序排序并输出。
3.注意输出格式要求,同时 一定一定一定要记得去重!!!
参考代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<myDate> myDateList = new ArrayList<>();
//先将输入的字符串划分成三小块
String[] split = scanner.next().split("/");
//再将其分别转换成对应的数字
int[] date = new int[3];
for (int i = 0; i < split.length; i++) {
date[i] = Integer.parseInt(split[i]);
}
//第一种:判断年在开头的情况
if (yearAtHead(date)) {
//先放入myDate类中,等排好序在输出
myDate myDate = new myDate(date[0], date[1], date[2]);
myDateList.add(myDate);
}
//第二种:判断年在末尾的情况
if (DayMonthYear(date)) myDateList.add(new myDate(date[2], date[1], date[0]));
if (monthDayYear(date)) myDateList.add(new myDate(date[2], date[0], date[1]));
//三种情况都不满足
if (myDateList.isEmpty()) return;
//最后对所有情况进行排序
else if (myDateList.size() == 1) System.out.println(myDateList.get(0).toString()); //一个的话就不需要排序了
else {
//多个的话:先进行去重处理
for (int i = 0; i < myDateList.size(); i++) {
for (int j = i + 1; j < myDateList.size(); j++) {
if (myDateList.get(i).equals(myDateList.get(j))){
myDateList.remove(myDateList.get(j));
j--; //防止漏掉对象没比
}
}
}
//排序(匿名内部类)
myDateList.sort(new Comparator<myDate>() {
@Override
public int compare(myDate o1, myDate o2) {
//年月日的顺序一次判断
if (o1.getYear() != o2.getYear()) return o1.getYear() - o2.getYear();
else {
if (o1.getMonth() != o2.getMonth()) return o1.getMonth() - o2.getMonth();
else return o1.getDay() - o2.getDay();
}
}
});
//排好序后进行迭代
for (int i = 0; i < myDateList.size(); i++) {
System.out.println(myDateList.get(i).toString());
}
}
}
//判断年在开头的情况 —— 年/月/日
public static boolean yearAtHead(int[] date) {
if (date[0] < 0 || date[0] > 99) return false;
//判断月份——合法范围
if (date[1] >= 1 && date[1] <= 12) {
//二月
if (date[1] == 2 && isRunNian(date[0])) {
//二月的闰年
if (date[2] >= 1 && date[2] <= 29) return true;
else return false;
}
//平年的二月
if (date[1] == 2 && !isRunNian(date[0])) {
if (date[2] >= 1 && date[2] <= 28) return true;
else return false;
}
//1,3,5,7,8,10,12月
if (date[1] == 1 || date[1] == 3 || date[1] == 5 || date[1] == 7 || date[1] == 8 || date[1] == 10 || date[1] == 12) {
if (date[2] <= 31 && date[2] >= 1) return true;
else return false;
}
//4,6,9,11月
if (date[1] == 4 || date[1] == 6 || date[1] == 9 || date[1] == 11) {
if (date[2] <= 30 && date[2] >= 1) return true;
else return false;
}
}
//月份不合法,不满足要求
return false;
}
//第二种情况:年在末尾:日月年
public static boolean DayMonthYear(int[] date) {
if (date[2] < 0 || date[2] >= 100) return false;
//判断月份
if (date[1] >= 1 && date[1] <= 12) {
//二月
if (date[1] == 2 && isRunNian(date[2])) {
//闰年二月
if (date[0] >= 1 && date[0] <= 29) return true;
else return false;
}
if (date[1] == 2 && !isRunNian(date[2])) {
//平年二月
if (date[0] >= 1 && date[0] <= 28) return true;
else return false;
}
//1,3,5,7,8,10,12
if (date[1] == 1 || date[1] == 3 || date[1] == 5 || date[1] == 7 || date[1] == 8 || date[1] == 10 || date[1] == 12) {
if (date[0] >= 1 && date[0] <= 31) return true;
else return false;
}
//4,6,9,11
if (date[1] == 4 || date[1] == 6 || date[1] == 9 || date[1] == 11) {
if (date[0] >= 1 && date[0] <= 30) return true;
else return false;
}
}
return false;
}
//第三种情况:月日年
public static boolean monthDayYear(int[] date) {
if (date[2] < 0 || date[2] > 99) return false;
//判断月份
if (date[0] <= 12 && date[0] >= 1) {
//二月
if (date[0] == 2 && isRunNian(date[2])) {
//闰年二月
if (date[1] >= 1 && date[1] <= 29) return true;
else return false;
}
//平年二月
if (date[0] == 2 && !isRunNian(date[2])) {
if (date[1] >= 1 && date[1] <= 28) return true;
else return false;
}
//1,3,5,7,8,10,12
if (date[0] == 1 || date[0] == 3 || date[0] == 5 || date[0] == 7 || date[0] == 8 || date[0] == 10 || date[0] == 12) {
if (date[1] >= 1 && date[1] <= 31) return true;
else return false;
}
//4,6,9,11
if (date[0] == 4 || date[0] == 6 || date[0] == 9 || date[0] == 11){
if (date[1] >= 1 && date[1] <= 30) return true;
else return false;
}
}
return false;
}
//辅助函数:判断是否为闰年
public static boolean isRunNian(int year) {
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) return true;
else return false;
}
}
class myDate {
private int year;
private int month;
private int day;
public myDate() {
}
public myDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
//重写toString()方法
@Override
public String toString() {
//这里主要是为了方便输出
String newYear = "" + year;
if (year >= 0 && year <= 9) newYear = "200" + year;
if (year >= 60 && year <= 99) newYear = "19" + year;
if (year >= 10 && year <= 59) newYear = "20" + year;
String newMonth = "" + month;
String newDay = "" + day;
//满足条件:输出
if (month >= 1 && month <= 9) newMonth = "0" + month;
if (day >= 1 && day <= 9) newDay = "0" + day;
return newYear + "-" + newMonth + "-" + newDay;
}
//重写equals()方法 —— 去重
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (this == obj) return true;
//内存地址不同
if (!(obj instanceof myDate)) return false; //不是myDate类型,没必要转
myDate date = (myDate) obj;
return this.year == date.year && this.month == date.month && this.day == date.day;
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复