このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
英語では名刺の複数形は多くのややこしい規則からなるが、大部分は4つのルールから複数形が生成される。次のようなルールである。
- s,z,x,ch,shで終わる場合はesを語尾につける
- ay,ey,iy,uy,oyで終わる場合はsを語尾につける
- yで終わるが上のルールを満たさない場合、最後のyを除いたうえでiesをつける
- それ以外はsを語尾につける
nouns[]という複数形に変化させる前の文字列が与えられたときに、上の4つのルールに従って複数形に変化させた時の結果を配列で返せ。
私の解答はこちら。
public class NounReform { public String[] makePlural(String[] nouns) { String[] rule1 = {"s", "z", "x", "ch", "sh"}; String[] rule2 = {"ay", "ey", "iy", "oy", "uy"}; String[] ret = new String[nouns.length]; LOOP : for( int i=0 ; i<nouns.length ; i++ ){ System.out.println(nouns[i]); for( int j=0 ; j<rule1.length ; j++ ){ if( nouns[i].endsWith(rule1[j]) ){ ret[i] = nouns[i] + "es"; continue LOOP; } } for( int j=0 ; j<rule2.length ; j++ ){ if( nouns[i].endsWith(rule2[j]) ){ ret[i] = nouns[i] + "s"; continue LOOP; } } if( nouns[i].endsWith("y") ){ // rule3にしてもよいかな? ret[i] = nouns[i].substring(0, nouns[i].length()-1) + "ies"; }else{ ret[i] = nouns[i] + "s"; // rule4に該当 } } return ret; } }
得点は159.48/250、中央値は約190点。C言語のgotoに相当することがしたくて、調べものをしたら時間がかかってしまった。
0 件のコメント:
コメントを投稿