Explicación detallada del clásico problema de fecha del algoritmo de enumeración java

contenido

algoritmo de enumeración

problema de fecha

enumerar ideas

código específico


 

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;
	}
}

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_52360069/article/details/123755641
Recomendado
Clasificación