2011年7月17日日曜日

TopCoder SRM203 Div2 250Pts

今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。

問題について説明する。ログイン名の登録について考える。新しくユーザ名を登録しようとしたときに、ユーザ名が既存のものとかぶってしまう可能性がある。そこで、後ろに数字を付けたユーザ名を登録者に提案することにするメソッドを作成する。後ろにつける数字は1から順につける。もし"abc"と登録しようとして、"abc","abc1"が存在していた場合は、"abc2"というユーザ名を返すようにする。

私の解答はこちら。

public class UserName {
 public String newMember(String[] existingNames, String newName) {
  int n = 0;
  boolean loop = false;
  StringBuffer sb = new StringBuffer(newName);
  while( true ){
   loop = false;
   for( int i=0 ; i<existingNames.length ; i++ ){
    if( existingNames[i].equals(sb.toString()) ){
     // 後ろにつける数値をインクリメントした後は、配列の先頭の方を再度見直さないとダメ。
     // フラグ変数(loop)を用意して、先頭からの探索を再実行するようにしている。
     n++;
     sb = new StringBuffer(newName + n);
     loop = true;
    }
   }
   if( loop == false ) break;
  }
  if( n == 0 ) return newName;
  return sb.toString();
 }
}

得点は210.49/250。全体の正解率は87%。後ろにつける数値をインクリメントするたびに、ループを先頭から実行しなおさないといけないことに気付くのに時間がかかった。その他、existingNames[i].equals(sb.toString())はtoString()を付けなかった(sbとしていた)ために、比較がうまくいかなかったというバグを出していた。StringBufferとStringではクラスがクラスが違うから、中身の文字列が同じであっても、オブジェクトとしては異なるものになっているということなのだろう。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計