2011年7月13日水曜日

TopCoder SRM200 Div2 250Pts

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計