今日の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 件のコメント:
コメントを投稿