1. 程式人生 > >【LeetCode & 劍指offer刷題】發散思維題8:Roman to Integer

【LeetCode & 劍指offer刷題】發散思維題8:Roman to Integer

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

Roman to Integer

Roman numerals are represented by seven different symbols:  I ,   V ,   X ,   L ,   C ,   D   and
  M . Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example, two is written as  
II  in Roman numeral, just two one's added together. Twelve is written as,   XII , which is simply   X   +   II . The number twenty seven is written as   XXVII , which is   XX  
+   V   +   II . Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not   IIII . Instead, the number four is written as   IV . Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as   IX . There are six instances where subtraction is used:
  • I  can be placed before  V  (5) and  X  (10) to make 4 and 9. 
  • X  can be placed before  L  (50) and  C  (100) to make 40 and 90. 
  • C  can be placed before  D  (500) and  M  (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. Example 1: Input: "III" Output: 3 Example 2: Input: "IV" Output: 4 Example 3: Input: "IX" Output: 9 Example 4: Input: "LVIII" Output: 58 Explanation: C = 100, L = 50, XXX = 30 and III = 3. Example 5: Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
C++   //問題:羅馬數字轉成整數 /* Roman numerals are usually written largest to smallest from left to right. 一般從大到小寫,如果從小到大寫為減法,如IV(4) IX(9) */ #include <unordered_map> #include <string> class Solution { public :     int romanToInt ( string s )     {         unordered_map < char , int > map =   { { 'I' , 1 },                                    { 'V' , 5 },                                    { 'X' , 10 },                                    { 'L' , 50 },                                    { 'C' , 100 },                                    { 'D' , 500 },                                    { 'M' , 1000 } };         int sum = map [ s . back ()]; //字串末尾字元         for ( int i = s . size ()- 2 ; i >= 0 ; i --) //從後往前掃描         {             if ( map [ s [ i ]] < map [ s [ i + 1 ]]) sum -= map [ s [ i ]]; //當前字元比後面字元對應數值小時,用減法             else sum += map [ s [ i ]];         }         return sum ;     } };