2012年1月21日土曜日

TopCoder SRM317 Div2 250Pts

このTopCoderの問題はPracticeRoomのみでみられるようである。問題についておおまかに説明する。

元の文字列の部分列を最大で1箇所ひっくり返し、角カッコ([と]のこと)で囲うというものは、暗号化する方法として安全とは言えない。例えば、暗号化された"he[row oll]ld"という文字列は"hello world"になる。sという暗号化された文字列が与えられたとき、元の文字列を返すようなメソッドを作成せよ。

注意点としては、文字列は小文字のアルファベット、スペース、角カッコのみから構成されること、また、角カッコは対になって出現するか、まったく出現しないかのどちらかになる。したがって、角カッコがない場合にも対処が必要になる。

私の解答はこちら。

public class ReversingBrackets {

 public String removeBrackets(String s) {
  String[] ss = s.split("[\\[\\]]"); // [と]を区切り文字にする
  StringBuffer sb = new StringBuffer();
  for( int i=0 ; i<ss.length ; i++ ){
   if( i == 1 ){ // ここに入るのは[]があったときのみ
    StringBuffer tmp = new StringBuffer();
    tmp.append(ss[i]).reverse();
    sb.append(tmp);
   }else{
    sb.append(ss[i]);
   }
  }
  return sb.toString();
 }

}

得点は237.70/250、中央値は約226点。[]があればssの長さは3、なければ1になるという性質を利用。また、区切り文字の有無を判定するには、indexOfを利用する方法も有力だろう。このsplitメソッドを用いた解答は少ない印象でした。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計