【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會員
36Content count
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
留言0
查看全部
發表第一個留言支持創作者!
Steven SHIH的沙龍 的其他內容
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
雖說旅行時要放鬆,但有些該看的觀光景點還是得去看一下,麥先生和 Danielson 第一天在盧比安那的最後一個行程就是去看旅遊指南裡推薦的古文明大國的城牆- Roman Wall,看著照片裡的城牆大家一定會覺得不就是一面很一般的城牆罷了,是也沒錯,但整個城牆其實是很長的。
Thumbnail
一段旋律、一句台詞,哪怕只是一個畫面,就能勾起你潛藏在心中的青春回憶:《鐵達尼號》的「你跳我跳」、《第六感生死戀》的手拉坏、《西雅圖夜未眠》的帝國大廈⋯⋯電癮食堂盤點了六部問世超過20年仍然在浪漫的情人佳節佔有一席之地的愛情電影!
Thumbnail
〈Isn’t it romantic?〉是一部以浪漫喜劇形式諷刺浪漫喜劇的電影。電影中,極度厭惡浪漫喜劇女主角Natali在一次暈厥後掉入浪漫喜劇版的紐約,發展出一連串的愛情故事後終於明白自己所愛為何,回到了現實世界並敞開心胸踏入一段醞釀已久的感情。儘管這部電影是以較為輕鬆、幽默的口吻去敘述一個非典
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
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
雖說旅行時要放鬆,但有些該看的觀光景點還是得去看一下,麥先生和 Danielson 第一天在盧比安那的最後一個行程就是去看旅遊指南裡推薦的古文明大國的城牆- Roman Wall,看著照片裡的城牆大家一定會覺得不就是一面很一般的城牆罷了,是也沒錯,但整個城牆其實是很長的。
Thumbnail
一段旋律、一句台詞,哪怕只是一個畫面,就能勾起你潛藏在心中的青春回憶:《鐵達尼號》的「你跳我跳」、《第六感生死戀》的手拉坏、《西雅圖夜未眠》的帝國大廈⋯⋯電癮食堂盤點了六部問世超過20年仍然在浪漫的情人佳節佔有一席之地的愛情電影!
Thumbnail
〈Isn’t it romantic?〉是一部以浪漫喜劇形式諷刺浪漫喜劇的電影。電影中,極度厭惡浪漫喜劇女主角Natali在一次暈厥後掉入浪漫喜劇版的紐約,發展出一連串的愛情故事後終於明白自己所愛為何,回到了現實世界並敞開心胸踏入一段醞釀已久的感情。儘管這部電影是以較為輕鬆、幽默的口吻去敘述一個非典
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世紀歐洲的浪漫主義影響,其滲透到人民生活之中。 大正浪漫除了打扮及文化藝術體現得到,室內外裝潢也極其受影響,裝修風格