LeetCode 每日一題「羅馬數字轉整數」

這是我參與更文挑戰的第6天,活動詳情查看: 更文挑戰java

本文正在參加「Java主題月 - Java 開發實戰」,詳情查看 活動連接面試

我是陳皮,一個在互聯網 Coding 的 ITer,微信搜索「陳皮的JavaLib」第一時間閱讀最新文章,回覆【資料】,便可得到我精心整理的技術資料,電子書籍,一線大廠面試資料和優秀簡歷模板。微信

題目

羅馬數字包含如下七種字符: I, V, X, L,C,D 和 M。markdown

字符 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如, 羅馬數字 2 寫作 II ,即爲兩個並列的 1。12 寫作 XII ,即爲 X + II 。 27 寫作 XXVII, 即爲 XX + V + II 。post

一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4 。一樣地,數字 9 表示爲 IX。這個特殊的規則只適用於如下六種狀況:測試

  • I 能夠放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
  • X 能夠放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
  • C 能夠放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。spa

示例1:code

  • 輸入: "III"
  • 輸出:3

示例2:orm

  • 輸入:"IV"
  • 輸出:4

示例3:圖片

  • 輸入:"IX"
  • 輸出:9

示例4:

  • 輸入:"LVIII"
  • 輸出:58
  • 解釋:L = 50, V= 5, III = 3.

示例5:

  • 輸入:"MCMXCIV"
  • 輸出:1994
  • 解釋:M = 1000, CM = 900, XC = 90, IV = 4.

提示

  • 1 <= s.length <= 15
  • s 僅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 題目數據保證 s 是一個有效的羅馬數字,且表示整數在範圍 [1, 3999] 內
  • 題目所給測試用例皆符合羅馬數字書寫規則,不會出現跨位等狀況。
  • IL 和 IM 這樣的例子並不符合題目要求,49 應該寫做 XLIX,999 應該寫做 CMXCIX 。

題目來源:LeetCode

分析

  • 如題目所說,羅馬數字中通常小的數字在大的數字的右邊,這種狀況下,只須要將每一個字符看做一個單獨的數值,將這些數值累計相加便可。例如羅馬數字 LXVII 都是小的數字在大的數字的右邊,則 LXVII = L + X + V + I + I = 50 + 10 + 5 + 1 + 1 = 67
  • 若是存在特例,小的數字在大的數字的左邊的話,那麼是須要將大的數字將去小的數字。例如 IV = -I + V = -1 + 5 = 4
  • 根據以上規則,遍歷一遍字符串便可。
package com.chenpi;

import java.util.HashMap;
import java.util.Map;

public class RomanToInt {

    // 規則
    Map<Character, Integer> ruleMap = new HashMap<>();
    {
        ruleMap.put('I', 1);
        ruleMap.put('V', 5);
        ruleMap.put('X', 10);
        ruleMap.put('L', 50);
        ruleMap.put('C', 100);
        ruleMap.put('D', 500);
        ruleMap.put('M', 1000);
    }

    public int romanToInt(String s) {
        int num = 0;
        int length = s.length();
        for (int i = 0; i < length; ++i) {
            int value = ruleMap.get(s.charAt(i));
            if (i < length - 1 && value < ruleMap.get(s.charAt(i + 1))) {
                num -= value;
            } else {
                num += value;
            }
        }
        return num;
    }

    public static void main(String[] args) {
        System.out.println(new RomanToInt().romanToInt("MCMXCIV"));
    }
}
複製代碼

在這裏插入圖片描述

上一題與下一題

上一題LeetCode 每日一題「接雨水」

下一題:敬請期待

相關文章
相關標籤/搜索