2011年8月11日木曜日

TopCoder SRM216 Div2 250Pts

今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。

カナダからアメリカに引っ越した二人はZEEという単語に困惑している。文字列textが与えられたときに、列中のZEEという単語をZEDという単語に置き換えるようなアシストをしてほしい。ここで言うZEEは前後に空白が含まれる単語であり、ZEEDという単語があった場合、それは置き換える必要はないものとする。また、単語の前後の空白はスペース一つであるものとする。

私の解答は以下の通り。問題文にtextは50字以内という条件があったので、それを利用した。

public class CultureShock {
 public String translate(String text) {
  for( int i=0 ; i<20 ; i++){
   text = text.replaceAll(" ZEE ", " ZED "); // textの途中の文字を置き換え
  }
  text = text.replaceAll("^ZEE ", "ZED "); // 先頭のZEEを置き換え
  text = text.replaceAll(" ZEE$", " ZED"); // 最後尾のZEEを置き換え
  text = text.replaceAll("^ZEE$", "ZED"); // ZEEだけだった場合の置き換え
  return text;
 }
}

得点は172.22/250、中央値は約190点。上の解答はあまりきれいではないので、見かけた解答をいくつか紹介する。

  • splitメソッドで配列に単語を格納し、ZEEをZEDに置き換えてそれらを空白を挟みながら、再結合する。
  • text.replaceAll("\\bZEE\\b","ZED");とする。
  • text = " " + text + " "と置き換え、text中の" ZEE "を" ZED "へ置換することを先頭から文字列の長さの分だけ繰り返して text.trim()で前後の空文字を外す。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計