contenido
algoritmo de enumeración
El algoritmo de enumeración es uno de los algoritmos que más usamos en nuestra vida diaria, y su idea central es enumerar todas las posibilidades . La esencia del método de enumeración es buscar la solución correcta de todas las respuestas candidatas.
El uso de este algoritmo debe cumplir dos condiciones: (1) el número de respuestas candidatas puede ser predeterminado ; (2) el rango de respuestas candidatas debe tener un cierto conjunto antes de resolver.
El algoritmo de enumeración es simple y rudo, enumera violentamente todas las posibilidades, probando todos los métodos tanto como sea posible. Si bien el algoritmo de enumeración es de fuerza bruta y puede ser lento, ¡realmente es nuestra principal prioridad! Porque el método de enumeración se convierte en el más fácil de implementar y el resultado siempre es correcto.
problema de fecha
Enlace del tema http://oj.hzjingma.com/p/7164?view=classic
Tema Descripción
Xiao Ming está clasificando un lote de documentos históricos. Muchas fechas aparecen en estos documentos históricos. Xiao Ming sabe que estas fechas son del 1 de enero de 1960 al 31 de diciembre de 2059. Lo que preocupa a Xiao Ming es que el formato de estas fechas es muy inconsistente, algunos usan año/mes/día, algunos usan mes/día/año y otros usan día/mes/año. Lo que es más problemático es que también se omiten los primeros dos dígitos del año, por lo que hay muchas fechas posibles correspondientes a una fecha en la literatura.
Por ejemplo, 03/02/04, puede ser 04 de marzo de 2002, 3 de febrero de 2004 o 02 de marzo de 2004.
Dada una fecha en la literatura, ¿puede ayudar a Xiao Ming a determinar qué fechas posibles le corresponden?ingresar
Una fecha en el formato "AA/BB/CC". (0 <= A, B, C <= 9)
producción
Muestra varias fechas diferentes, una línea para cada fecha, en el formato "yyyy-MM-dd". Se organizan varias fechas desde la mañana hasta la noche.
Muestra
ingresar 02/03/04 producción 2002-03-04
2004-02-03
2003-03-02
enumerar ideas
La idea general del problema de la fecha es juzgar si la fecha es legal o no en función de nuestros intentos de enumerar, como mes 1-12, fecha 1-31 o juicio de año bisiesto, etc. La clave es enumerar todas las fechas para juzgar, encontrar la respuesta correcta y evitar la enumeración repetida o elementos faltantes.
código específico
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 要补0
if (_month < 10) {
month = "0" + _month;
}
if (_day < 10) {
day = "0" + _day;
}
return _year + "-" + month + "-" + day;
}
}