今日の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 件のコメント:
コメントを投稿