LeetCode:Roman to Integer

來源:互聯網
上載者:User

標籤:

1、題目名稱

Roman to Integer (羅馬數字到阿拉伯數位轉換)

2、題目地址

https://leetcode.com/problems/roman-to-integer/

3、題目內容

英文:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

中文:給出一個羅馬數字,將它轉換成整數。輸入在1-3999之間。

4、題目分析

這個題目和題目#12(阿拉伯數字到羅馬數位轉換)需要實現的功能相反,是將羅馬數字轉換為阿拉伯數字。關於羅馬數字與十進位數位規律,在 #12的解題方案 中已有說明,雖然羅馬數字並不是明顯的十進位數字,但每一位都有共同的規律可循。

5、解題方法1

根據羅馬數字每個十進位位的共同規律,在解析羅馬數位時候,可以從高位到低位,逐位轉換成阿拉伯數字。

例如,代表單位1的羅馬數字為“I”,單位5為“V”,單位10為“X”,那1-10的羅馬數字就是I、II、III、IV、V、VI、VII、VIII、IX、X。十位的情況就是把“I”換成“X”、把“V”換成“L”、把“X”換成“C”,從而得出10-100的羅馬數字是X、XX、XXX、XL、L、LX、LXX、LXXX、XC、C。其餘各位以此類推。

一個比較笨拙的Java實現代碼如下:

/** * 功能說明:LeetCode 13 - Roman to Integer  * 開發人員:Tsybius * 開發時間:2015年8月3日 */public class Solution {    /**     * 羅馬數字轉換為阿拉伯數字     * @param s 被轉換的羅馬數字     * @return 轉換後的阿拉伯數字     */    public int romanToInt(String s) {        String[] temp;        String result = "";        //千位        temp = getArabicNumber(s, "M", " ", " ");        result += temp[0];        s = temp[1];                //百位        temp = getArabicNumber(s, "C", "D", "M");        result += temp[0];        s = temp[1];                //十位        temp = getArabicNumber(s, "X", "L", "C");        result += temp[0];        s = temp[1];        //個位        temp = getArabicNumber(s, "I", "V", "X");        result += temp[0];        s = temp[1];                return Integer.parseInt(result);    }        /**     * 將羅馬數位首位轉換為阿拉伯數字(需要指定具體位的1、5、10三個字母)     * @param romanNumber 羅馬數字     * @param one 一     * @param five 五     * @param ten 十     * @return 數組     *     第一項為輸入羅馬數字中最高位元對應的阿拉伯數字     *     第二項為刪去該數字後剩餘部分的羅馬數字      */    private String[] getArabicNumber(String romanNumber,         String one, String five, String ten) {        //9        if (romanNumber.length() >= 2 &&             romanNumber.substring(0, 2).equals(one + ten)) {            return new String[] { "9", romanNumber.substring(2) };        }                //8        if (romanNumber.length() >= 4 &&             romanNumber.substring(0, 4).equals(five + one + one + one)) {            return new String[] { "8", romanNumber.substring(4) };        }                //7        if (romanNumber.length() >= 3 &&             romanNumber.substring(0, 3).equals(five + one + one)) {            return new String[] { "7", romanNumber.substring(3) };        }                //6        if (romanNumber.length() >= 2 &&             romanNumber.substring(0, 2).equals(five + one)) {            return new String[] { "6", romanNumber.substring(2) };        }                //5        if (romanNumber.length() >= 1 &&             romanNumber.substring(0, 1).equals(five)) {            return new String[] { "5", romanNumber.substring(1) };        }                //4        if (romanNumber.length() >= 2 &&             romanNumber.substring(0, 2).equals(one + five)) {            return new String[] { "4", romanNumber.substring(2) };        }        //3        if (romanNumber.length() >= 3 &&             romanNumber.substring(0, 3).equals(one + one + one)) {            return new String[] { "3", romanNumber.substring(3) };        }        //2        if (romanNumber.length() >= 2 &&             romanNumber.substring(0, 2).equals(one + one)) {            return new String[] { "2", romanNumber.substring(2) };        }        //1        if (romanNumber.length() >= 1 &&             romanNumber.substring(0, 1).equals(one)) {            return new String[] { "1", romanNumber.substring(1) };        }        //0        return new String[] { "0", romanNumber };    }}

6、解題方法2

因為上一個方法中存在相似代碼重複使用的情況,因此可以嘗試盡量用數組和迴圈減少程式碼數。

Java代碼如下:

/** * 功能說明:LeetCode 13 - Roman to Integer  * 開發人員:Tsybius2014 * 開發時間:2015年8月3日 */public class Solution {    /**     * 羅馬數字轉換為阿拉伯數字     * @param s 被轉換的羅馬數字     * @return 轉換後的阿拉伯數字     */    public int romanToInt(String s) {        //羅馬數字 1、5、10、50、100、500、1000        String romanNumber = "IVXLCDM  ";                String[] temp; //臨時數組        String result = ""; //計算結果        //迴圈千位、百位、十位、個位        for (int i = 6; i >= 0; i-=2) {                        //擷取1、5、10三個數字單位            String one = romanNumber.substring(i, i + 1);            String five = romanNumber.substring(i + 1, i + 2);            String ten = romanNumber.substring(i + 2, i + 3);                        temp = getArabicNumber(s, one, five, ten);            result += temp[0];            s = temp[1];        }                return Integer.parseInt(result);    }        /**     * 將羅馬數位首位轉換為阿拉伯數字(需要指定具體位的1、5、10三個字母)     * @param romanNumber 羅馬數字     * @param one 一     * @param five 五     * @param ten 十     * @return 數組     *     第一項為輸入羅馬數字中最高位元對應的阿拉伯數字     *     第二項為刪去該數字後剩餘部分的羅馬數字      */    private String[] getArabicNumber(String romanNumber,         String one, String five, String ten) {        //羅馬數位長度        int[] romanNumber1to9Length = new int[] {            1, 2, 3, 2, 1, 2, 3, 4, 2        };                //羅馬數位構成        String[] romanNumber1to9 = new String[] {            one, one + one, one + one + one, one + five, five,             five + one, five + one + one, five + one + one + one, one + ten        };                //1-9的情況匹配        for (int i = 9; i >= 1; i--) {            int len = romanNumber1to9Length[i - 1];            String num = romanNumber1to9[i - 1];            if (romanNumber.length() >= len &&                 romanNumber.substring(0, len).equals(num)) {                return new String[] {                     String.valueOf(i), romanNumber.substring(len)                 };            }        }                //無匹配情況,返回0        return new String[] { "0", romanNumber };    }}

7、解題方法3

雖然羅馬數位書寫規則較為複雜,但根據羅馬數字“左加右減”的規律,可以構造出更簡單的羅馬數字轉換阿拉伯數位方法:即從右向左(從低位向高位)考察羅馬數字,遇到比上一個數字大的數字就加上,遇到比上一個數字小的數字就減去。

Java代碼如下:

import java.util.HashMap;/** * 功能說明:LeetCode 13 - Roman to Integer  * 開發人員:Tsybius2014 * 開發時間:2015年8月3日 */public class Solution {    /**     * 羅馬數字轉換為阿拉伯數字     * @param s 被轉換的羅馬數字     * @return 轉換後的阿拉伯數字     */    public int romanToInt(String s) {        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();                hashMap.put(‘I‘, 1);        hashMap.put(‘V‘, 5);        hashMap.put(‘X‘, 10);        hashMap.put(‘L‘, 50);        hashMap.put(‘C‘, 100);        hashMap.put(‘D‘, 500);        hashMap.put(‘M‘, 1000);                int result = 0;         int temp = 0; //臨時變數,用於判斷加減        int weight = 0; //當前讀取到的羅馬數位權重        for (int i = s.length() - 1; i >= 0; i--) {            weight = hashMap.get(s.charAt(i));            if (temp <= weight) {                result += weight;                temp = weight;            } else {                result -= weight;                temp = weight;            }        }                return result;    }}

END

LeetCode:Roman to Integer

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.