このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
古代の呪文を含んだspellという文字列が与えられる。その呪文は暗号化されているいるが、暗号はかなり単純なものである。呪文を解読するために、AとZという文字をすべて見つける必要がある。そして、その順序を判断させるのである。例えば、暗号化された文字列が、"AABZCADZA"であれば、AとZを見つけ出し、それらの順序(A->A->Z->A->Z->A)を反転させて、"AZBACZDAA"という解読結果を得る(AとZの位置だけに注目すると反転していることが分かる)。与えられたspellという文字列に対し、解読した結果得られる文字列を返すようなメソッドを作成せよ。
私の解答はこちら。
import java.util.ArrayList; public class MagicSpell { public String fixTheSpell(String spell) { // 出現した文字と出現した位置を記録しておく ArrayList<Character> list = new ArrayList<Character>(); ArrayList<Integer> pos = new ArrayList<Integer>(); for( int i=0 ; i<spell.length() ; i++ ){ char c = spell.charAt(i); if( c == 'A' || c == 'Z' ){ list.add(0, c); // 0の位置にcを入れることでAとZの出現順序を反転させている pos.add(i); } } StringBuilder sb = new StringBuilder(); int idx = 0; for( int i=0 ; i<spell.length() ; i++ ){ if( idx == pos.size() ){ // 全部AとZが出てきたら終了 sb.append(spell.substring(i)); break; } if( pos.get(idx) == i ){ sb.append(list.get(idx)); idx++; }else{ sb.append(spell.charAt(i)); } } return sb.toString(); } }
得点は150.26/250、3回目のsubmitでシステムテストクリア。中央値は約229点。idxが最後まで来た時にbreakで終了するように仕向けないと、pos.get(idx)の評価でエラーを起こすことに気付かず嵌る。
0 件のコメント:
コメントを投稿