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