2011年10月9日日曜日

TopCoder SRM258 Div2 250Pts

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

コメントを投稿

フォロワー

ページビューの合計