iT邦幫忙

2025 iThome 鐵人賽

DAY 0
0
自我挑戰組

LeetCode 每日一題挑戰系列 第 11

鐵人賽 Day 11 — Roman to Integer

  • 分享至 

  • xImage
  •  

昨天我們才剛把 Integer to Roman 搞懂,今天馬上迎來反向操作 —— Roman to Integer。
其實這題就像昨天的倒帶,只是方向顛倒了,但也有一些小陷阱要注意。

題目核心

羅馬數字轉換規則有兩種情況:

一般情況:數字從大到小排列,直接加起來就好。

例:XII = 10 + 1 + 1 = 12

減法情況:當小數字出現在大數字前面時,代表要做減法。

例:IV = 5 - 1 = 4,CM = 1000 - 100 = 900

解題思路

建立一個 HashMap,把每個羅馬字母對應的值存起來:

I → 1
V → 5
X → 10
L → 50
C → 100
D → 500
M → 1000

從左到右掃描字串:

如果「當前值 < 下一個值」,就代表這是一個「減法情況」,所以要用 next - current。

否則,直接加上當前值。

迴圈結束後,就能得到答案。

Java程式碼
import java.util.*;

class Solution {
public int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);

    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        int value = map.get(s.charAt(i));
        // 如果不是最後一個字元,還要跟下一個比較
        if (i + 1 < s.length() && value < map.get(s.charAt(i + 1))) {
            result -= value;
        } else {
            result += value;
        }
    }
    return result;
}

}

測試範例

"III" → 3

"LVIII" → 58

"MCMXCIV" → 1994

undefinedundefinedundefinedundefined 心得

這題其實就是把「特殊情況」抓出來。
昨天我們是從大數字往下拆,今天是從字串順序判斷「加」還是「減」。
我覺得這兩題放在一起練超有感,因為剛好前後呼應:

Integer to Roman → 貪心法 (從大到小挑最大的符號)

Roman to Integer → 掃描法 (遇到小的在大的前面就減)


上一篇
LeetCode 鐵人賽 Day 10 —Integer to Roman
下一篇
鐵人賽 Day 12 — Longest Common Prefix
系列文
LeetCode 每日一題挑戰12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言