このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。
この問題は、0点から100点までのテストの点数の配列scores[]が与えられたとき、その配列のモードを配列にして返せというものである。モードは最頻値とも呼ばれており、もっとも出現回数が多かった値を指す。モードが配列になるのは、最頻値が複数になることもありうるからである。例えばsocres[] = {10,10,20,20,25}であれば、最頻値は2回登場した{10,20}ということになる。
私の解答はこちら。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
public class ClassScores {
public int[] findMode(int[] scores) {
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
// Hashで、点数(キー)と出現回数の組を作る
for( int i=0 ; i<scores.length ; i++ ){
if( hm.containsKey(scores[i]) == false ){
hm.put(scores[i], 1);
}else{
hm.put(scores[i], hm.get(scores[i])+1);
}
}
// 出現回数の最大値を計算する
int maxTimes = 0;
Iterator<Integer> it = hm.keySet().iterator();
while( it.hasNext() ){
Integer val = it.next();
int times = hm.get(val);
if( times > maxTimes ) maxTimes = times;
}
// 出現回数が最大値の点数をリストにする
ArrayList<Integer> list = new ArrayList<Integer>();
it = hm.keySet().iterator();
while( it.hasNext() ){
Integer val = it.next();
if( maxTimes == hm.get(val) ){
list.add(val);
}
}
int[] array = new int[list.size()];
for( int i=0 ; i<list.size() ; i++ ){
array[i] = list.get(i);
}
// リストは昇順にソート
Arrays.sort(array);
return array;
}
}得点は122.25/250。アルゴリズムは分かっているのに、実装の方法が分からないことで、大幅なタイムロス。イテレータとか仕事で使いませんからとか言ってみる。

0 件のコメント:
コメントを投稿