コンテンツ
列挙アルゴリズム
列挙アルゴリズムは、私たちが日常生活で最もよく使用するアルゴリズムの1つであり、その中心的なアイデアは、すべての可能性を列挙することです。列挙方法の本質は、すべての候補の回答から正しい解を検索することです。
このアルゴリズムを使用するには、次の2つの条件を満たす必要があります。(1)候補の回答の数を事前に決定できます。(2)候補の回答の範囲は、解く前に特定のセットを持っている必要があります。
列挙アルゴリズムは単純で失礼です。彼はすべての可能性を激しく列挙し、可能な限りすべての方法を試します。列挙アルゴリズムはブルートフォースであり、低速になる可能性がありますが、それは本当に私たちの最優先事項です!列挙メソッドは実装が最も簡単になり、結果は常に正しいためです。
日付の問題
トピックリンクhttp://oj.hzjingma.com/p/7164?view=classic
トピックの説明
Xiao Mingは、一連の歴史的文書を整理しています。これらの歴史的文書には多くの日付が記載されています。Xiao Mingは、これらの日付が1960年1月1日から2059年12月31日までであることを知っています。Xiao Mingが問題にしているのは、これらの日付の形式が非常に一貫していないことです。一部は年/月/日を使用し、一部は月/日/年を使用し、一部は日/月/年を使用します。さらに厄介なのは、年の最初の2桁も省略されているため、文献の日付に対応する可能性のある日付が多数あることです。
たとえば、02/03/04の場合は、2002年3月4日、2004年2月3日、または2004年3月2日です。
文学の日付を考えると、Xiao Mingがそれに対応する可能性のある日付を決定するのを手伝ってもらえますか?入力
「AA/BB/CC」形式の日付。(0 <= A、B、C <= 9)
出力
「yyyy-MM-dd」の形式で、日付ごとに1行ずつ、いくつかの異なる日付を出力します。複数の日付が朝から夜に配置されます。
サンプル
入力 04/02/03 出力 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 要补0
if (_month < 10) {
month = "0" + _month;
}
if (_day < 10) {
day = "0" + _day;
}
return _year + "-" + month + "-" + day;
}
}