枚举算法经典日期问题详解java

简介: 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。 枚举法的本质就是从所有候选答案中去搜索正确的解。

目录
枚举算法
日期问题
枚举思想
具体代码
__

枚举算法
枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。 枚举法的本质就是从所有候选答案中去搜索正确的解。
使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。
枚举算法简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法。虽然枚举算法非常暴力,而且速度可能很慢,但确实我们最应该优先考虑的!因为枚举法变成实现最简单,并且得到的结果总是正确的。
日期问题
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入
一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输出
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
样例
输入
02/03/04
输出
2002-03-04
2004-02-03
2003-03-02
枚举思想
日期问题一般思路都是根据我们的尝试枚举判断日期是否合法等,例如月份1-12,日期1-31或闰年的判断等等。重点在于枚举出所有日期的情况去判断,找出正确答案,避免重复枚举或缺项。
具体代码

  1. package Test;
  2. import java.util.Iterator;
  3. import java.util.Scanner;
  4. import java.util.TreeSet;
  5. public class _日期问题 {
  6. public static void main(String[] args) {
  7. Scanner scanner = new Scanner(System.in);
  8. String data = scanner.next();
  9. String[] str = data.split("/");//以字符 ' / ' 分割成字符串数组
  10. TreeSet ans = new TreeSet();//存放正确答案的集合,利用set集合去重
  11. // 01/02/03
  12. //枚举三种情况日/月/年 ,年/月/日,月/日/年
  13. String case1 = f(str[0], str[1], str[2]);
  14. String case2 = f(str[2], str[0], str[1]);
  15. String case3 = f(str[2], str[1], str[0]);
  16. //如果case字符串合法则加入结果集
  17. if (case1.length() > 0)
  18. ans.add(case1);
  19. if (case2.length() > 0)
  20. ans.add(case2);
  21. if (case3.length() > 0)
  22. ans.add(case3);
  23. //遍历输出结果
  24. Iterator iterator = ans.iterator();
  25. for (String anser : ans) {
  26. System.out.println(anser);
  27. }
  28. }
  29. /**
    • 判断是否合法,
    • @param year
    • @param month
    • @param day
    • @return 空字符串"" 表示不合法
  30. */
  31. private static String f(String year, String month, String day) {
  32. int _year = Integer.parseInt(year);
  33. int _month = Integer.parseInt(month);
  34. int _day = Integer.parseInt(day);
  35. if (_year <= 59)//0-59表示2000年以后,要加上2000
  36. _year += 2000;
  37. else //60-99表示1960 - 1999年,加上1900
  38. _year += 1900;
  39. if (_month > 12 || _month < 1)//判断月份是否合法 <1或者>12均不合法
  40. return "";
  41. if (_day > 31 || _day < 1)//判断日期是否合法<1或者>31均不合法
  42. return "";
  43. /**
    • 接下来判断每个月份对应的日期是否合法(前面已经保证月份1-31)
    • 1,3,5,7,8,10,12每个月固定31天,一定合法
    • 因此要判断其他月份的时候是否合法
  44. */
  45. if(_month == 2) {
  46. //闰年>29不合法
  47. if ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0) {
  48. if (_day > 29)
  49. return "";
  50. }
  51. }else {
  52. //其他月份>30不合法
  53. if (_day > 30)
  54. return "";
  55. }
  56. //月份和日期不足10 要补0
  57. if (_month < 10) {
  58. month = "0" + _month;
  59. }
  60. if (_day < 10) {
  61. day = "0" + _day;
  62. }
  63. return _year + "-" + month + "-" + day;
  64. }
  65. }
相关文章
|
13天前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
17天前
|
Java API 调度
Java 日期与时间处理:精准掌控时间流转
Java 8引入了全新的日期和时间API,解决了旧版`java.util.Date`和`Calendar`类设计不佳、操作繁琐的问题。新API包括`LocalDate`、`LocalTime`和`LocalDateTime`类,操作简洁直观,符合日常思维习惯。同时提供了`Period`和`Duration`处理时间间隔,以及`DateTimeFormatter`进行格式化输出。这些改进使开发者能更高效、准确地处理日期和时间,极大提升了开发效率与代码质量。 (239字符)
54 6
|
2月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
131 60
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
67 26
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
64 24
|
2月前
|
安全 Java API
告别SimpleDateFormat:Java 8日期时间API的最佳实践
在Java开发中,处理日期和时间是一个基本而重要的任务。传统的`SimpleDateFormat`类因其简单易用而被广泛采用,但它存在一些潜在的问题,尤其是在多线程环境下。本文将探讨`SimpleDateFormat`的局限性,并介绍Java 8引入的新的日期时间API,以及如何使用这些新工具来避免潜在的风险。
46 5
|
4月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
95 9
Java——反射&枚举
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
123 2
|
3月前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
61 14