LeetCode 羅馬數字轉化為整數

2021-12-30 01:31:37 字數 1599 閱讀 3225

leetcode 羅馬數字轉化為整數:給定乙個羅馬數字,將其轉換為整數。輸入保證在1到3999之間。

羅馬數字定義:

羅馬數字共有七個,即i(1),v(5),x(10),l(50),c(100),d(500),m(1000)。按照下面的規則可以表示任意正整數。 重複數次:乙個羅馬數字重複幾次,就表示這個數的幾倍。 右加左減:

在乙個較大的羅馬數字的右邊記上乙個較小的羅馬數字,表示大數字加小數字。

在乙個較大的數字的左邊記上乙個較小的羅馬數字,表示大數字減小數字。

但是,左減不能跨越等級。比如,99不可以用ic表示,用xcix表示。 加線乘千:在乙個羅馬數字的上方加上一條橫線或者在右下方寫m,表示將這個數字乘以1000,即是原數的1000倍。同理,如果上方有兩條橫線,即是原數的1000000倍。 單位限制:同樣單位只能出現3次,如40不能表示為***x,而要表示為xl。

組合規則:

(1) 基本數字 ⅰ、x 、c 中的任何乙個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用乙個。

(2) 不能把基本數字 v 、l 、d 中的任何乙個作為小數放在大數的左邊採用相減的方法構成數目;放在大數的右邊採用相加的方式構成數目,只能使用乙個。

(3) v 和 x 左邊的小數字只能用 ⅰ。

(4)l 和 c 左邊的小數字只能用 。

(5)d 和 m 左 邊的小數字只能用 c 。

還有一點需要格外注意:

mcm是1900

mcmxcvi是1996

按照邏輯 遍歷到c 的處理,mc先m+c,但是遍歷到第二個m的時候,順序是cm,這個時候要減去這個c以及之前多加的c,也就是減去兩個c。

例子:xcix 是 99 遍歷到第二個x時,+10-2*1

好好體會上面的,下面**實現:

#include

using namespace std;

class solution

return res;

}int chartoint(char s)

}};int main()

一直從左往右轉化,為什麼不考慮一下從右往左轉化呢?

//89ms

int romantoint1(string s)

else

res -= chartoint(s[i]);

}return res;

}最後我還發現了乙個我從未用過的方法:效率最高。

//52ms

#include

int romantoint2(string s), , , , , , };

int res = 0;

for (int i = 0; i < s.size(); ++i)

else

}return res;

}上面這個演算法充分利用了羅馬數字兩個數字前後順序的關係,也就是說如果是i在v前面,也就是iv,它代表4,反之代表6。再搭配c++的無序map,可以巧妙的通過陣列來進行判斷而達到對ret或加或減的目的。

羅馬數字轉化

先看位置計數的定義 一種表達數字的系統,數字按照順序排列 每個數字有乙個位值,數字的值是每個數字和位值的乘積之和。電腦科學導論 p25 羅馬數字計數法 相同的數字連寫,所表示的數等於這些數字相加得到的數,如 3 小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數,如 8 12 小的數字 限...

阿拉伯數字轉化為羅馬數字

include include include define rows 4 define cols 4 int nums rows cols char roms rows cols 二維的陣列指標 void judge int num 判斷輸入的數字是否在制定範圍內 void trans int n...

羅馬數字轉化為阿拉伯數字

羅馬數字是位置計數嗎?位置計數是一種表達數字的系統,數字按照順序排列 每個數字有乙個位值,數字的值是每個數字和位值的乘積之和。羅馬數字包含七個基本符號 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 相同的數字連寫,所表示的數等於這些數字相加得到的數 小的數字在大的數字的右...