1028 年国勢調査 (20 ポイント)
ある町では国勢調査を実施し、住民全員の誕生日を調べました。次に、町の最高齢者と最年少者を見つけるプログラムを作成してください。
これにより、入力された各日付が合法であることが保証されますが、必ずしも合理的であるとは限りません。たとえば、町には 200 歳を超える老人がいないことがわかっていて、今日は 2014 年 9 月 6 日であるため、200 歳を超える誕生日も、まだ誕生日を迎えていない人も、生年月日は不合理であるため、除外する必要があります。
入力形式:
入力では、最初の行に正の整数Nが与えられ、値は (0,105) になります。
]; にN行が続き、各行には人の名前 (英字 5 文字以内の文字列) と誕生日がyyyy/mm/dd
(年/月/日など) の形式で示されます。この質問により、最年長と最年少の間に同数がないことが保証されます。
出力フォーマット:
有効な誕生日の数、長男と末っ子の名前をスペースで区切って順番に 1 行に出力します。
入力例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
出力サンプル:
3 Tom John
質問分析:
落とし穴: テスト ポイント 3 は、すべてのデータが不合理で、直接 0 を出力するだけの状況です。
日付を Date データ型に変換する必要はありません。「1814/09/06」<「2001/05/12」など、文字列のcompareToメソッドを使用して、日付を文字列として直接処理できます。
ACコードではありません:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
//分别存放临时名字,临时日期,年少名字,年长名字
String name,date,maxname="",minname="",maxdate="1814/09/06",mindate="2014/09/06";
int count=0;//记录满足范围的个数
for(int i=0;i<N;i++){
String[] str=br.readLine().split(" ");
name=str[0];date=str[1];//临时名字,临时日期
//date必须满足这个范围
if(date.compareTo("2014/09/06")<=0&&date.compareTo("1814/09/06")>=0){
count++;//记录满足范围的个数
//寻找年少者,这里要是不理解的话好好体会体会,主要是符号,>还是<
if(maxdate.compareTo(date)<0){
maxdate=date;
maxname=name;
}
//寻找年长者
if(mindate.compareTo(date)>0){
mindate=date;
minname=name;
}
}
}
//如果count=0,直接输出count
System.out.print(count);
if(count!=0){
System.out.printf(" "+minname+" "+maxname);
}
}
}
この方法は非常に簡単だと思います。すべての日付を int 型に変換し、18140906、20140906 と指定されたデータの大小関係を比較することもできます。この方法でも、最後のテスト ポイントでタイムアウトします。
さらに詳しいトピック分析については、公開アカウント Algorithm Baby をフォローしてください。