[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 }
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 }
Attention:
Know what is Roman Number before coding.