目录

枚举算法

日期问题

枚举思想

具体代码


枚举算法

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

使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。

枚举算法简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法。虽然枚举算法非常暴力,而且速度可能很慢,但确实我们最应该优先考虑的!因为枚举法变成实现最简单,并且得到的结果总是正确的。

日期问题

题目链接http://oj.hzjingma.com/p/7164?view=classic

题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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或闰年的判断等等。重点在于枚举出所有日期的情况去判断,找出正确答案,避免重复枚举或缺项。

具体代码

package Test;import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;public class _日期问题 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String data = scanner.next();String[] str = data.split("/");//以字符 ' / ' 分割成字符串数组TreeSet<String> ans = new TreeSet<String>();//存放正确答案的集合,利用set集合去重// 01/02/03//枚举三种情况日/月/年 ,年/月/日,月/日/年String case1 = f(str[0], str[1], str[2]);String case2 = f(str[2], str[0], str[1]);String case3 = f(str[2], str[1], str[0]);//如果case字符串合法则加入结果集if (case1.length() > 0)ans.add(case1);if (case2.length() > 0)ans.add(case2);if (case3.length() > 0)ans.add(case3);//遍历输出结果Iterator<String> iterator = ans.iterator();for (String anser : ans) {System.out.println(anser);}}/*** 判断是否合法,* @param year* @param month* @param day* @return 空字符串"" 表示不合法*/private static String f(String year, String month, String day) {int _year = Integer.parseInt(year);int _month = Integer.parseInt(month);int _day = Integer.parseInt(day);if (_year <= 59)//0-59表示2000年以后,要加上2000_year += 2000;else         //60-99表示1960 - 1999年,加上1900_year += 1900;if (_month > 12 || _month < 1)//判断月份是否合法  <1或者>12均不合法return "";if (_day > 31 || _day < 1)//判断日期是否合法<1或者>31均不合法return "";/*** 接下来判断每个月份对应的日期是否合法(前面已经保证月份1-31)* 1,3,5,7,8,10,12每个月固定31天,一定合法* 因此要判断其他月份的时候是否合法*/if(_month == 2) {//闰年>29不合法if ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0) {if (_day > 29)return "";}}else {//其他月份>30不合法if (_day > 30)return "";}//月份和日期不足10 要补0if (_month < 10) {month = "0" + _month;}if (_day < 10) {day = "0" + _day;}return _year + "-" + month + "-" + day;}
}

枚举算法经典日期问题详解java相关推荐

  1. 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述

    算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...

  2. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  3. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  4. 0编译器详解_详解Java枚举类型(Enum)中的方法

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  5. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  6. java 枚举类型enum的用法详解

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...

  7. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  8. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  9. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

最新文章

  1. Codeforces #449 div2 C题
  2. 通过PROC信息调节TCP窗口
  3. Ubuntu Linux 提出新的发布模式——测试周
  4. ajax get请求_python测试开发django50.jquery发送Ajax请求(get)
  5. SpringBoot FK-关联表查询(二)
  6. linux中shell curl命令获取http状态码--------强大的网络传输工具
  7. Vuex之state和getters
  8. 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明
  9. 妙用chrome插件,实现U校园自动填答案
  10. 如何更改计算机屏幕分辨率,如何修改电脑默认屏幕分辨率
  11. 华为虚拟机eNSP命令大全
  12. 移动硬盘连接计算机接口类型,移动硬盘数据线接口类型有哪几种-单usb接口
  13. 喧嚣过后,揭秘《咪蒙教你月薪5万》背后的真相
  14. HTML相对路径简析
  15. 拉钩网前端项目实战06
  16. 寻宝游戏设定_第1集的答案(寻宝游戏)
  17. 2021年职业病防治法宣传周宣传资料
  18. ADB interface驱动安装失败解决方法
  19. matlab将一列数分割为若干组,将数据拆分为不同组并计算统计量
  20. 【黑马程序员西安中心】我和传智有个梦!

热门文章

  1. 欧几里得范数/欧几里得距离(L2范数)
  2. 无限循环小数四则运算_循环小数period;四则运算
  3. 父进程产生一系列子进程,每个子进程打印自己的PID然后退出,父进程最后打印PID
  4. 【科研】ET-BERT资料库梳理
  5. node 写爬虫,原来这么简单
  6. 编写第一个正式的网页
  7. 烟台:百亿新能源整车项目落户 打造新能源汽车全产业链
  8. linux uniq按照一列去重,linux uniq命令用法
  9. 业内首个支持渐进式组件化的开源框架
  10. asterisk 数据库 php,使用FreePBX和Asterisk调用PHP脚本