leetcode-羅馬數(shù)字轉(zhuǎn)整數(shù)
題意
羅馬數(shù)字包含以下七種字符:?I,?V,?X,?L,C,D? 和 M。
字符?數(shù)值
I?1
V?5
X?10
L?50
C?100
D?500
M?1000
例如, 羅馬數(shù)字 2 寫做 ?II?,即為兩個并列的 1。12 寫做 ?XII?,即為 ?X + II?。27 寫做 ??XXVII, 即為 ?XX + V + II?。
通常情況下,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例,例如 4 不寫做 ?IIII,而是 ?IV。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地,數(shù)字 9 表示為 ?IX。這個特殊的規(guī)則只適用于以下六種情況:
I ?可以放在 ?V (5) 和 ?X (10) 的左邊,來表示 4 和 9。 X ?可以放在 ?L (50) 和 ?C (100) 的左邊,來表示 40 和 ?90。 C ?可以放在 ?D (500) 和 ?M (1000) 的左邊,來表示 ?400 和 ?900。給定一個羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)。輸入確保在 1 ?到 3999 的范圍內(nèi)。
示例
示例 ?1:
輸入:?"III"
輸出:?3
示例 ?2:
輸入:?"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.
提示
題目所給測試用例皆符合羅馬數(shù)字書寫規(guī)則,不會出現(xiàn)跨位等情況。
IC 和 IM 這樣的例子并不符合題目要求,49 應(yīng)該寫作 XLIX,999 應(yīng)該寫作 CMXCIX 。
關(guān)于羅馬數(shù)字的詳盡書寫規(guī)則,可以參考 羅馬數(shù)字 - Mathematics 。
出處
鏈接:https://leetcode-cn.com/problems/roman-to-integer
思路
首先明確一下題意,輸入一串字符串,輸出一個整數(shù)。再次,字符串還挺有規(guī)律的,產(chǎn)自羅馬。我們自然而然會想到創(chuàng)建一個羅馬數(shù)字和數(shù)字的關(guān)系映射,在這里我們可以創(chuàng)建一個對象,根據(jù)鍵值對來解答,也可以試試 Map 來建立他們之間的關(guān)系,然后由題意可以知道,存在一些特例,大的數(shù)字在小的后面,所以我們順藤摸瓜地想到了,前后兩個元素比大小,如果前面的比后面的大,那么就把前面的加到結(jié)果,如果后面的比前面的大,那么就把后面的減去前面的加到結(jié)果中去,這里還是要討論下特殊情況,當(dāng)只有一個元素的時候,就可以直接返回了,除此之外,因為是整數(shù),做的多了有經(jīng)驗就會去考慮精度會不會溢出,好開心呀,這題輸入范圍在[1, 3999],過。
代碼
/**
?*?@param?{string}?s
?*?@return?{number}
?*/
const?romanToInt?=?function?(s)?{
??const?obj?=?{
????I:?1,
????V:?5,
????X:?10,
????L:?50,
????C:?100,
????D:?500,
????M:?1000,
??};
??let?res?=?0;
??if?(s.length?===?1)?{
????res?=?obj[s];
??}?else?{
????for?(let?i?=?0;?i???????if?(obj[s[i]]?1]])?{
????????res?=?res?+?obj[s[i?+?1]]?-?obj[s[i]];
????????i++;
??????}?else?{
????????res?=?res?+?obj[s[i]];
??????}
????}
??}
??return?res;
};
export?default?romanToInt;
測試
import?romanToInt?from?'../../code/leetcode/13';
describe('test?function?romanToInt:',?()?=>?{
??test('test?case?s?=?MCMXCIV',?()?=>?{
????const?res?=?romanToInt('MCMXCIV');
????expect(res).toBe(1994);
??});
??test('test?case?s?=?III',?()?=>?{
????const?res?=?romanToInt('III');
????expect(res).toBe(3);
??});
??test('test?case?s?=?DCXXI',?()?=>?{
????const?res?=?romanToInt('DCXXI');
????expect(res).toBe(621);
??});
??test('test?case?s?=?MDCXCV',?()?=>?{
????const?res?=?romanToInt('MDCXCV');
????expect(res).toBe(1695);
??});
});
思考
在不嫌麻煩的情況下,你能先實現(xiàn)個哈希表,然后再用樓上的想法帶進去實現(xiàn)嗎?
哈哈哈哈,挖坑不填坑。。。。。。
說明
本文首發(fā)于 GitHub 倉庫https://github.com/ataola/coding,線上閱讀地址:https://zhengjiangtao.cn/coding/,轉(zhuǎn)載請注明出處,謝謝!
