本日の問題はこちら(要TopCoder登録 & 問題文は英語)。
問題のおおまかな訳は以下の通り。
四則演算ができる計算機クラスSimpleCalculatorを考える。入力の形式は文字列で入力され、<数値> <op> <数値>という形式をしている。<数値>は1以上10000以下の数である。<op>は+、-、*、/のどれかである。このとき、演算結果を返すSimpleCalculatorのメソッドcalculateを作成せよ。結果は0以下になることも当然ありうる。
例えば、"200/4"という文字列が入ってきたら答えは50である。
私が書いたコードはこちら。
public class SimpleCalculator {
public int calculate(String input) {
int[] num = new int[2];
String[] snum = new String[2];
String sop="";
String[] ops = new String[]{"+","-","*","/"};
int op=0;
for( int i=0 ; i<ops.length ; i++){ // 数値と数値の間にある記号を判定
if( input.indexOf(ops[i]) >=0 ){
op = i;
sop = ops[i];
break;
}
}
if( sop.equals("*") ){ // 記号がメタ文字であった場合の対処
sop = "\\*";
}else if( sop.equals("+") ){
sop = "\\+";
}
snum = input.split(sop);
for( int i=0 ; i<2 ; i++){
num[i] = Integer.parseInt(snum[i]);
}
switch(op){ // 文字の種類に応じて処理を決める
case 0:
return num[0]+num[1];
case 1:
return num[0]-num[1];
case 2:
return num[0]*num[1];
case 3:
return num[0]/num[1];
default:
break;
}
return 0;
}
}得点は158.30/250(System Test Passed)。点数も低いし、汚いコードになってしまった。
最初に躓いたのが正規表現で、+や*がメタ文字ではなく、文字列としての+や*にしてならないといけないということに気付かなかった。+と*だけエスケープシーケンスを付けるという汚い書き方で対処。次に汚いコードと感じられる点は変数opで、これをint型でなく、せめてchar型にしておけば、後半のswitch文に意味のある変数として渡せるということである。0,1,2,3という処理はあまりきれいじゃないな。
新しく学んだこととしては、Integer.parseInt("00001")=1になってくれるということである。自動的に先頭の0は削除してくれるようだ。今回のコードはもう少し学べばもっとうまくかけそうだ。

0 件のコメント:
コメントを投稿