このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。
文字列型のcustomerNames[]という、データベースから抽出された顧客のリストが与えられる。あなたのやることは1度よりも多くリストに現れた人と、その現れた回数を報告することである。レポートは文字列型の配列で返す。配列の各要素は"NAME OCCURS"という形式で返す。NAMEは顧客の名前で、OCCURSは顧客がリスト中に登場した回数である。出力は顧客の名前でアルファベット順にするようにせよ。なお、顧客名は常に大文字のみからなる。
私の解答はこちら。
import java.util.ArrayList; import java.util.Iterator; import java.util.TreeMap; public class CustomerStatistics { public String[] reportDuplicates(String[] customerNames) { // 顧客の名前でソートしたいのでHashMapを利用する TreeMap<String,Integer> tm = new TreeMap(); for( int i=0 ; i<customerNames.length ; i++ ){ if( tm.containsKey(customerNames[i]) == false ){ // 初登場の名前 tm.put(customerNames[i], 1); }else{ int n = tm.get(customerNames[i]); // 登場回数を記録し、 tm.remove(customerNames[i]); // 情報を取り除き、 tm.put(customerNames[i], n+1); // 1つ加えてハッシュに入れる } } // イテレータは順序があれば、その順序は保証することになっている // ただのMapなどでは順序が保証されない。 Iterator<String> it = tm.keySet().iterator(); ArrayList<String> aList = new ArrayList (); while( it.hasNext() ){ String s = it.next(); int val = tm.get(s); if( val >= 2 ){ aList.add(s + " " + val); // 条件に合うものだけ取り出しリストに入れる } } // リストを配列に変換する。引数のnew String[0]がポイント。 String[] ret = (String[])aList.toArray(new String[0]); return ret; } }
得点は169.21/250、中央値は約213点。Listを配列に変換する方法が分からなくて苦労していた。toArrayメソッドはしっていただが、new String[0]を引数に取らなかったために、ClassCastExceptionが発生して解くのに時間がかかってしまった。
0 件のコメント:
コメントを投稿