1. 程式人生 > >LeetCode Roman to Integer

LeetCode 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.

即將羅馬數字1-3999轉換成對應的整數。羅馬數字規則見wiki:羅馬數字規則

Java 實現


/**
 * Given a roman numeral, convert it to an integer.
 * <p>
 * Input is guaranteed to be within the range from 1 to 3999.
 *
 * @author li.hzh 2017-10-13 12:00
 */
public class RomanToInteger { public static void main(String[] args) { RomanToInteger romanToInteger = new RomanToInteger(); System.out.println(romanToInteger.romanToInt("III")); System.out.println(romanToInteger.romanToInt("VI")); System.out.println(romanToInteger
.romanToInt("XIX")); System.out.println(romanToInteger.romanToInt("MCDXXXVII")); } public int romanToInt(String s) { int pre = 0, result = 0; for (int i = s.length() - 1; i >= 0; i--) { char c = s.charAt(i); int value = 0; switch (
c) { case 'M': value = 1000; break; case 'D': value = 500; break; case 'C': value = 100; break; case 'L': value = 50; break; case 'X': value = 10; break; case 'V': value = 5; break; case 'I': value = 1; break; } if (pre == 0) { result = pre = value; } else { result = value >= pre ? result + value : result - value; pre = value; } } return result; } }

分析

仔細閱讀wiki裡介紹的羅馬數字編寫規則,其實並不難理解。尤其一種一條,領我讓我頓悟:

但是,左減時不可跨越一個位值。比如,99不可以用IC( {\displaystyle 100-1} 100-1)表示,而是用XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同於阿拉伯數字每位數字分別表示。)

括號裡的文字,讓我理解了羅馬數字的規則,完全可以把羅馬數字也拆成個人,十位,百位來分別對待,如此一來,這個轉換規則就簡單了。直接從右往左遍歷字串,左邊比的右邊的大或相等結果就加上該值,左邊的比右邊的小就減掉該值。而且,根據規則還不可能出現連續小於等於的情況。因此,如此簡單處理就可以做到轉換。