Roman To Integer --leetcode

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

相關文章
相關標籤/搜索