1. 程式人生 > >LeetCode 羅馬數字轉整數

LeetCode 羅馬數字轉整數

Given a roman numeral, convert it to an integer.

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

要求輸入一個羅馬數字,將其轉化為整數,其範圍在1到3999之間。

要弄清楚這個題目首先需要搞清楚羅馬數字的工作流程。

不談別的我就直接上例子了:

I 1
V 5,來源於五個手指的形狀。
X 10,來源於兩手交握的形狀。
L 50,共和時期寫作⊥,有時候下面那橫是有弧度的。
C 100,可能來源於centum的縮寫
Iɔ或Ð 500,ɔ應該是大寫的(打不出來了);Ð中間有一橫,現代拉丁文寫作D。


CIɔ或M 1000,M來源於mille的縮寫,不常用。
Φ∞ 也表示1000,常在銘文中使用,實際上D的產生,就是把Φ的一半。
Q 500000,是quingenta milia的縮寫。

其他的數字都由這些基本數字重複、組合或二者結合而成。
比如:
Ⅱ=2 XX=20 CCC=300
請注意V和L不重複使用。
如果小數位於大數之前(即處於大數左側),請將大數減去小數
IX=9 XL=40
如果小數位於大數之後(即處於大數右側),請將兩者相加
LX=60 DC=600
在一個數字中,後者要優先於前者
CCXIV=CC+X+IV=214 而非 CC+XI+V=200+11+5=216
216應該寫作CCXVI
如果一個小數出現在兩個大數中間,它要被右側的大數減去


MCM=1900

這邊最值得注意的是後者要優先於前者,由於這句話的存在於是我們想到是否可以從後向前遍歷的方式進行取值,知道這點之後我們開始。

public class RomanToInt {
    public static void main(String[] args){
        String s = "DCXXI";
        romanToInt(s);
    }

    public static int romanToInt(String s) {
        if(s == null) return 0; // 防止錯誤輸入
int latestVal = 0;  // 
當前值 int curVal = 0; // 總數 int lastVal = changeCharToInt(""+s.charAt(s.length()-1)); // 上一個的值,賦初值,以防迴圈中ifelse判斷錯誤 // 從後向前遍歷字串 for (int i=s.length()-1;i>=0;i--){ latestVal = changeCharToInt(""+s.charAt(i)); if(latestVal>=lastVal) curVal+=latestVal; else curVal = curVal-latestVal; lastVal = latestVal; } return curVal; } public static int changeCharToInt(String s){ // 單個字元判斷函式 按照羅馬字元規律來就行 switch (s.toUpperCase()){ case "I": return 1; case "V": return 5; case "X": return 10; case "L": return 50; case "C": return 100; case "D": return 500; case "M": return 1000; default: return 0; } } }