Explicação detalhada do problema clássico de data do algoritmo de enumeração java

contente

algoritmo de enumeração

problema de data

enumerar ideias

código específico


 

algoritmo de enumeração

O algoritmo de enumeração é um dos algoritmos que mais utilizamos no nosso dia a dia, e sua ideia central é enumerar todas as possibilidades . A essência do método de enumeração é procurar a solução correta de todas as respostas dos candidatos.

O uso desse algoritmo precisa atender a duas condições: (1) o número de respostas candidatas pode ser predeterminado ; (2) o intervalo de respostas candidatas deve ter um determinado conjunto antes da resolução.

O algoritmo de enumeração é simples e rude, ele enumera violentamente todas as possibilidades, tentando todos os métodos ao máximo. Embora o algoritmo de enumeração seja força bruta e possa ser lento, é realmente nossa principal prioridade! Porque o método de enumeração se torna o mais fácil de implementar e o resultado está sempre correto.

problema de data

Link do tópico http://oj.hzjingma.com/p/7164?view=classic

Descrição do tópico

Xiao Ming está separando um lote de documentos históricos. Muitas datas aparecem nesses documentos históricos. Xiao Ming sabe que essas datas são de 1º de janeiro de 1960 a 31 de dezembro de 2059. O que incomoda Xiao Ming é que o formato dessas datas é muito inconsistente, alguns usam ano/mês/dia, alguns usam mês/dia/ano e alguns usam dia/mês/ano. O que é mais problemático é que os dois primeiros dígitos do ano também são omitidos, de modo que há muitas datas possíveis correspondentes a uma data na literatura.   
Por exemplo, 02/03/04, pode ser 04 de março de 2002, 3 de fevereiro de 2004 ou 02 de março de 2004.   
Dada uma data na literatura, você pode ajudar Xiao Ming a determinar quais datas possíveis correspondem a ela?

entrar

Uma data no formato "AA/BB/CC". (0 <= A, B, C <= 9)   

saída

Imprima várias datas diferentes, uma linha para cada data, no formato "aaaa-MM-dd". Várias datas são organizadas de manhã à noite.

Amostra

entrar
02/03/04
saída

04-03-2002

03-02-2004

02-03-2003

enumerar ideias

A ideia geral do problema da data é julgar se a data é legal ou não com base em nossas tentativas de enumerar, como mês 1-12, data 1-31 ou julgamento de ano bissexto, etc. A chave é enumerar todas as datas para julgar, encontrar a resposta correta e evitar enumerações repetidas ou itens ausentes.

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

 

 

 

Acho que você gosta

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