package com.helloxin.leetcode.algorithms; /** * Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; 10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; 100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; 1000~3000: {"M", "MM", "MMM"}. */ public class RomanToInteger { //這題目真是讓人頭大 由於我還要知道羅馬數字是怎麼樣 表示數字的 /** * 羅馬數字與十進位數字的意義不一樣,它沒有表示零的數字,與進位制無關. * 用羅馬數字表示數的基本方法通常是把若干個羅馬數字寫成一列,它表示的數等於各個數字所表示的數相加的和. * 可是也有例外,當符號Ⅰ、Ⅹ或C位於大數的後面時就做爲加數;位於大數的前面就做爲減數. * 例如:Ⅲ=3,Ⅳ=4,Ⅵ=6,ⅩⅨ=19,ⅩⅩ=20,ⅩLⅤ=45,MCMLXXX=1980. * 羅馬數字因書寫繁難,因此,後人不多采用.如今有的鐘表表面仍有用它表示時數的. * 此外,在書稿章節及科學分類時也有采用羅馬數字的. */ public static int romanToInt(String s) { if(null == s || s.isEmpty() || s.length() == 0){ throw new RuntimeException("s can't be null or empty"); } if(s.length() == 1){ return toNumber(s.charAt(0)); }else { int ret = toNumber(s.charAt(0)); for (int i = 1; i < s.length(); i++) { if (toNumber(s.charAt(i - 1)) < toNumber(s.charAt(i))) { //這邊考慮了 不會出現錯誤的羅馬數字 好比MCMLXXX 的狀況 可是沒有對羅馬數據規範作檢查 ret += toNumber(s.charAt(i)) - 2*toNumber(s.charAt(i - 1)); } else { ret += toNumber(s.charAt(i)); } } return ret; } } public static int toNumber(char ch) { switch (ch) { 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: throw new RuntimeException("wrong roman number"); } } public static void main(String[] args) { System.out.println(romanToInt("MCMLXXX")); } }
git地址:https://github.com/woshiyexinjie/leetcode-xingit