今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。
問題について説明する。
左から順に演算を行うという、通常の四則演算とは異なる演算を行う。つまり、3+5*7といえば、普通は5*7を優先し3+35=28とするが、今回は左にある3+5を優先し、8*7=56とする。さて、0-9の一桁の数字と+、-、*の演算子が交互に現れる文字列exprが与えられたときに、左から順に演算を行った結果を返すメソッドevaluateを作成せよ。
私の解答は以下の通り。
public class NoOrderOfOperations { public int evaluate(String expr) { int num = 0; int oldnum = Integer.parseInt(expr.substring(0,1)); // 先頭の数値 char op = 'a'; // 初期化のためだけ...不格好だ boolean flg =true; for( int i=1 ; i<expr.length() ; i++){ if( Character.isDigit(expr.charAt(i) ) ){ num = Integer.parseInt(expr.substring(i,i+1)); if( flg == false ){ if( op == '+' ){ oldnum += num; }else if( op == '-'){ oldnum -= num; }else if( op == '*'){ oldnum *= num; } } flg = true; }else if( expr.charAt(i) == '+' ){ op = '+'; flg = false; }else if( expr.charAt(i) == '-' ){ op = '-'; flg = false; }else if( expr.charAt(i) == '*' ){ op = '*'; flg = false; } } return oldnum; } }
得点は136.96/250。正解率は約93%。最初は二桁の数値が入ったらなどと思い、面倒な実装をしていたが、問題文をよく読むと非常に単純だった。こうして勘違いのなごりがあるプログラムができた。
良い解答を見つけたので、写経しておく。上のようなフラグも不要であり、非常に見通しがよい。
public class NoOrderOfOperations { public int evaluate(String expr) { int val = expr.charAt(0)-'0'; for( int i=0 ; i<expr.length() ; i++ ){ if( expr.charAt(i)=='+' ){ val += expr.charAt(i+1)-'0'; // 先の1文字をとってきて計算 }else if( expr.charAt(i)=='-' ){ val -= expr.charAt(i+1)-'0'; }else if( expr.charAt(i)=='*' ){ val *= expr.charAt(i+1)-'0'; } // i番目の文字が数値である場合はif文の中に入らず、何もしない } return val; } }
0 件のコメント:
コメントを投稿