本日の問題はこちら(要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 件のコメント:
コメントを投稿