zoukankan      html  css  js  c++  java
  • [Leetcode 17] 13 Roman to Integer

    Problem:

    Given a roman numeral, convert it to an integer.

    Input is guaranteed to be within the range from 1 to 3999.

    Analysis:

    Some Roman Number examples can be seen here: http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm

    Use a one pass scan to decide whether add or subtract a number from current sum.

    If a number is greater or equal to its successor or it's the last number, add it.

    If a numver is less than its successor, subtract it.

    Code:

     1 public class Solution {
     2     public int romanToInt(String s) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         int sum = 0;
     6         
     7         for (int i=0; i<s.length(); ++i) {
     8             int numi = rtoi(s.charAt(i));
     9             
    10             if (i==(s.length()-1)) {
    11                 sum += numi;
    12             } else if ( numi >= rtoi(s.charAt(i+1))) {
    13                 sum += numi;
    14             } else {
    15                 sum -= numi;
    16             }
    17         }
    18     
    19         return sum;
    20     }
    21     
    22     private int rtoi(char x) {
    23         int val=0; 
    24         
    25         switch (x) {
    26             case 'I': val = 1; break;
    27             case 'V': val = 5; break;
    28             case 'X': val = 10; break;
    29             case 'L': val = 50; break;
    30             case 'C': val = 100; break;
    31             case 'D': val = 500; break;
    32             case 'M': val = 1000; break;
    33         }
    34         
    35         return val;
    36     }
    37 }
    View Code

    An efficient version that call helper function only once in each iteration

     1 public class Solution {
     2     public int romanToInt(String s) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         int sum = 0, numi=0, numiSucc=rtoi(s.charAt(0));
     6         
     7         for (int i=0; i<s.length(); ++i) {
     8             numi = numiSucc;
     9             
    10             if (i==(s.length()-1)) {
    11                 sum += numi;
    12                 break;
    13             }
    14             
    15             numiSucc = rtoi(s.charAt(i+1));
    16             if ( numi >= numiSucc) {
    17                 sum += numi;
    18             } else {
    19                 sum -= numi;
    20             }
    21         }
    22     
    23         return sum;
    24     }
    25     
    26     private int rtoi(char x) {
    27         int val=0; 
    28         
    29         switch (x) {
    30             case 'I': val = 1; break;
    31             case 'V': val = 5; break;
    32             case 'X': val = 10; break;
    33             case 'L': val = 50; break;
    34             case 'C': val = 100; break;
    35             case 'D': val = 500; break;
    36             case 'M': val = 1000; break;
    37         }
    38         
    39         return val;
    40     }
    41 }
    View Code

    Attention:

    Know what is Roman Number before coding.

  • 相关阅读:
    ZR#330. 【18 提高 3】矿石(容斥)
    牛客NOIP提高组R1 C保护(主席树)
    BZOJ1026: [SCOI2009]windy数(数位dp)
    AtCoderBeginnerContest109题解
    BZOJ3679: 数字之积(数位dp)
    牛客NOIP普及组R1 C括号(dp)
    牛客NOIP提高组R1 A中位数(二分)
    BZOJ1576: [Usaco2009 Jan]安全路经Travel(最短路 并查集)
    ZRDay6A. 萌新拆塔(三进制状压dp)
    Python 入门教程 10 ---- Student Becomes the Teacher
  • 原文地址:https://www.cnblogs.com/freeneng/p/3086465.html
Copyright © 2011-2022 走看看