2011年7月26日火曜日

TopCoder SRM209 Div2 250Pts

今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。

問題について説明する。時間のn-移動平均を計算する。n-移動平均とは連続するn個のデータの平均である。連続するデータに対し、1番目からn番目までの平均、2番目から(n+1)番目までの平均、3番目から(n+2)番目までの平均と計算していくことで計算される。今、平均を計算する際に対象とするべきデータ数nと、"hh:mm:ss"(hh時mm分ss秒)というフォーマットからなる文字列型の配列times[]が与えられたときに、時間の秒数のn-移動平均を計算するメソッドを作成せよ。ただしnはtimesの長さ以下である。また、hhは00~23、mmは00~59、ssは00~59であり、timesの要素数は1以上50以下である。また、移動平均の秒数は小数点以下は切り捨てるものとする。

私の解答はこちら。

public class MovingAverages {
 public int[] calculate(String[] times, int n) {
  int[] ret = new int[times.length-n+1];
  int[] seconds = new int[times.length];
  // hh:mm:ssのフォーマットをすべて秒数に変換する
  for( int i=0 ; i<times.length ; i++ ){
   String[] t = times[i].split(":");
   seconds[i] = Integer.parseInt(t[0])*3600+Integer.parseInt(t[1])*60+Integer.parseInt(t[2]);
  }
  // 上で得られた秒数に対して、移動平均の計算
  for( int i=0 ; i<ret.length ; i++ ){
   for( int j=0 ; j<n ; j++ ){
    ret[i] += seconds[i+j];
   }
   ret[i] /= n;
  }
  return ret;
 }

}

得点は228.35/250。中央値は約132点。正解率は約95.8%。秒数の変換で迷うことが無かったので、中央値よりもかなり高速に実装ができた。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計