【LittleDuck_LeetCodeNote】13 - Roman to Integer

閱讀時間約 13 分鐘

A realistic, brightly colored interior home-style drawing in blue tones of a software engineer. - Leonardo.ai

Question and Hints

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol        Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, 2 is written as II in Roman numeral, just two ones added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
  • I can be placed before V (5) and X (10) to make 4 and 9.
  • X can be placed before L (50) and C (100) to make 40 and 90.
  • C can be placed before D (500) and M (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer.
Example 1:
Input: s = "III"
Output: 3
Explanation: III = 3.
Example 2:
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 3:
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Constraints:
  • 1 <= s.length <= 15
  • s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
  • It is guaranteed that s is a valid roman numeral in the range [1, 3999].

First Solution

💡 用switch-case從第一個字母開始找,
用對應的文字找出這一輪對應的的Index,記錄為nowIndex,
因為羅馬數字有將小字母擺在大字母左邊表示相減的特性,
所以檢查上一個字母(lastIndex)是否小於nowIndex,
如果是,就先相減,再做相加,
如果不是就直接加。
class Solution {
public int romanToInt(String s) {
char[] RomanNumber = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
int[] RomanValue = {1, 5, 10, 50, 100, 500, 1000};
int lastIndex = 0, nowIndex = 0, result = 0;

for(int i=0; i < s.length(); i++){
switch(s.charAt(i)){
case 'I':
nowIndex = 0;
break;
case 'V':
nowIndex = 1;
break;
case 'X':
nowIndex = 2;
break;
case 'L':
nowIndex = 3;
break;
case 'C':
nowIndex = 4;
break;
case 'D':
nowIndex = 5;
break;
case 'M':
nowIndex = 6;
break;
}
if(i == 0)
lastIndex = nowIndex;
if(lastIndex < nowIndex){
result -= RomanValue[lastIndex] * 2;
}
result += RomanValue[nowIndex];
lastIndex = nowIndex;
}

return result;
}
}
⏰ Runtime: 4 ms (95.38 %)
📦 Memory: 42.8 MB (57.74 %)

Upgrade Solution

more clear.
💡 First Solution邏輯大致上對了,但可以改得更精簡, 並且,順序反過來會更好找。
  • 不用2個陣列,而是直接在switch-case完成羅馬數字的參照轉換(透過number)
  • 因為不用陣列,所以不用Index,而是直接用字母代表的數字進行比較。
  • 「小字母擺在大字母左邊表示相減的特性」從數學角度來看,即當由右往左看時,下一個數字如果比較小,就要進行相減,比起原本相減2次更直觀。
  • JDK14更新了switch-case的寫法,改用 -> 取代 : ,且結尾不用再寫break。
class Solution {
public int romanToInt(String s) {
int answer = 0, number = 0, prev = 0;

for (int j = s.length()-1; j >= 0; j--) {
switch (s.charAt(j)) {
case 'M' -> number = 1000;
case 'D' -> number = 500;
case 'C' -> number = 100;
case 'L' -> number = 50;
case 'X' -> number = 10;
case 'V' -> number = 5;
case 'I' -> number = 1;
}
if (number < prev)
answer -= number;
else
answer += number;
prev = number;
}
return answer;
}
}
⏰ Runtime: 3 ms (100 %)
📦 Memory: 42.9 MB (57.74 %)

Bonus Solution

Use Hashtable to store Roman numbers.
💡 與First Solution的邏輯相同,差別在於用Hashtable替代兩個陣列,
結果來看明顯比較慢,
其實兩個陣列的搜尋方式就跟Hashtable的道理是一樣的,
只是把key跟value寫出來,
並且中間沒有Hash function轉換,
所以兩個陣列反而比較快,
但HashTable還是有安全性上的優點。
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 value=0;
char prevVal = 'I';
for(int i=s.length()-1; i>=0; i--){
char nowVal = s.charAt(i);
if(map.get(nowVal) < map.get(prevVal))
value -= map.get(nowVal);
else
value += map.get(nowVal);
prevVal = nowVal;
}
return value;
}
}
⏰ Runtime: 7 ms (35.9 %)
📦 Memory: 42.6 MB (82.32 %)
為什麼會看到廣告
6會員
36內容數
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
留言0
查看全部
發表第一個留言支持創作者!
Steven SHIH的沙龍 的其他內容
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
雖說旅行時要放鬆,但有些該看的觀光景點還是得去看一下,麥先生和 Danielson 第一天在盧比安那的最後一個行程就是去看旅遊指南裡推薦的古文明大國的城牆- Roman Wall,看著照片裡的城牆大家一定會覺得不就是一面很一般的城牆罷了,是也沒錯,但整個城牆其實是很長的。
Thumbnail
一段旋律、一句台詞,哪怕只是一個畫面,就能勾起你潛藏在心中的青春回憶:《鐵達尼號》的「你跳我跳」、《第六感生死戀》的手拉坏、《西雅圖夜未眠》的帝國大廈⋯⋯電癮食堂盤點了六部問世超過20年仍然在浪漫的情人佳節佔有一席之地的愛情電影!
Thumbnail
You can either travel or read, but either your body or soul must be on the way.
Thumbnail
雙叟咖啡館的前身是一間新潮服務店,於1812年創立。1885年,店老闆在服飾店內利用空間,開闢了一隅咖啡館。昔時附庸風雅的文人Verlaine、Rimbaud和Mallarmé,由於特愛這家小店的擺飾與氣氛,於是定期在此聚會。雙叟咖啡館從此在巴黎文化圈佔有重要的一席之地。畢卡索、海明威、......
Thumbnail
專科口試之後,終於迎來短暫的平靜。稍微擺脫死記硬背的各種疾病,先不動腦,用感官去品嘗人生。 Vosne Romanée 村莊級與一級園的品酒會 by王府酒業 When to start? From a long long story
Thumbnail
在隔了一年後栢龍帶來了帝國拓荒者:北方帝國的二個擴充,羅馬及日本擴充。新擴充新挑戰。 在擴充中一樣的是一個種族分作二個不同部落的設計,也就是說加入這兩個擴充就會多四個部落可以使用。此外也新增了不少島嶼卡,能夠改善基本版會感到島嶼卡偏少的狀況。
Thumbnail
During the moment between completely awake and fully asleep, not stressfully at all, freely enjoy everything shown.  Nice atmosphere, comfortable touc
Thumbnail
Have you ever seen a black-comedy which is hopeless romantic and whimsically beautiful? Meet “Pushing Daisies” and enjoy a Tim Burton style fantasy.
大正浪漫的室內設計會是怎樣?繼日式復古昭和風格室內設計後,今次跟大家分享「大正浪漫」室內設計。大正時代和其他日本風不同,整體形象別樹一幟,東西洋風格揉合並存,原因是當時日本人受到19世紀歐洲的浪漫主義影響,其滲透到人民生活之中。 大正浪漫除了打扮及文化藝術體現得到,室內外裝潢也極其受影響,裝修風格
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
雖說旅行時要放鬆,但有些該看的觀光景點還是得去看一下,麥先生和 Danielson 第一天在盧比安那的最後一個行程就是去看旅遊指南裡推薦的古文明大國的城牆- Roman Wall,看著照片裡的城牆大家一定會覺得不就是一面很一般的城牆罷了,是也沒錯,但整個城牆其實是很長的。
Thumbnail
一段旋律、一句台詞,哪怕只是一個畫面,就能勾起你潛藏在心中的青春回憶:《鐵達尼號》的「你跳我跳」、《第六感生死戀》的手拉坏、《西雅圖夜未眠》的帝國大廈⋯⋯電癮食堂盤點了六部問世超過20年仍然在浪漫的情人佳節佔有一席之地的愛情電影!
Thumbnail
You can either travel or read, but either your body or soul must be on the way.
Thumbnail
雙叟咖啡館的前身是一間新潮服務店,於1812年創立。1885年,店老闆在服飾店內利用空間,開闢了一隅咖啡館。昔時附庸風雅的文人Verlaine、Rimbaud和Mallarmé,由於特愛這家小店的擺飾與氣氛,於是定期在此聚會。雙叟咖啡館從此在巴黎文化圈佔有重要的一席之地。畢卡索、海明威、......
Thumbnail
專科口試之後,終於迎來短暫的平靜。稍微擺脫死記硬背的各種疾病,先不動腦,用感官去品嘗人生。 Vosne Romanée 村莊級與一級園的品酒會 by王府酒業 When to start? From a long long story
Thumbnail
在隔了一年後栢龍帶來了帝國拓荒者:北方帝國的二個擴充,羅馬及日本擴充。新擴充新挑戰。 在擴充中一樣的是一個種族分作二個不同部落的設計,也就是說加入這兩個擴充就會多四個部落可以使用。此外也新增了不少島嶼卡,能夠改善基本版會感到島嶼卡偏少的狀況。
Thumbnail
During the moment between completely awake and fully asleep, not stressfully at all, freely enjoy everything shown.  Nice atmosphere, comfortable touc
Thumbnail
Have you ever seen a black-comedy which is hopeless romantic and whimsically beautiful? Meet “Pushing Daisies” and enjoy a Tim Burton style fantasy.
大正浪漫的室內設計會是怎樣?繼日式復古昭和風格室內設計後,今次跟大家分享「大正浪漫」室內設計。大正時代和其他日本風不同,整體形象別樹一幟,東西洋風格揉合並存,原因是當時日本人受到19世紀歐洲的浪漫主義影響,其滲透到人民生活之中。 大正浪漫除了打扮及文化藝術體現得到,室內外裝潢也極其受影響,裝修風格