leetcode-個人題解12
阿新 • • 發佈:2019-01-29
LEETCODE專題
12. Integer to Roman
題目要求:
題目相信大家都看得懂,下面就來直接說一下筆者遇到的問題吧。
- 問題
- 如何將對應的位數轉為羅馬數字。
- 遇到4, 9的情況如何區分。
這裡來簡單科普一下羅馬數字的字元表示:
十進位制數字 | 羅馬數字 |
---|---|
1 | I |
4 | IV |
5 | V |
9 | IX |
10 | X |
40 | XL |
50 | L |
90 | XC |
100 | C |
400 | CD |
500 | D |
900 | CM |
1000 | M |
所以對於每個位數的數字,其羅馬數字字元都是不一樣的,其規則也是具有5和10的雙重判定
為了解決這個問題,我們可以自行定義這些對映,再在轉羅馬數字的時候呼叫這個對映就可以了。
這樣第一個問題就迎刃而解了。
然而棘手的是第二個問題。
從表中我們可以看到當數字為4或者9時起羅馬數字是有異同點的。相同的點就是位數一致時,他們的羅馬數字第一個字元都是一樣的,都是該位數的單位值。例如40和90的羅馬數字第一個字元就是表示10的”X”,10即該位數的單位值。不同的點是它們羅馬數字的第二個字元不一樣。但是,我們也可以看出規律,例如40的羅馬數字第二個字元就是表示50的”L”,而90的羅馬數字第二個字元就是表示100的”C”。這樣問題就簡單多了,我們可以判定數字為4時,字串為該位數的單位值加上該位數表示5的羅馬數字字元;數字為9時,字串為該位數的單位值加上該位數表示10的羅馬數字字元。
class Solution {
public:
string intToRoman(int num) {
/* mod the num with 1000, 500 or so
* and set the Roman char
*/
int mod = 1000;
char weight;
// stroe the Roman string
string Roman;
while (num != 0 && mod != 0) {
weight = getWeight(mod );
if (modHalf(mod) == true) {
// exception handler for 9
if (num / (mod / 5) == 9) {
Roman += getWeight(mod / 5);
Roman += getWeight(mod * 2);
num %= mod / 5;
mod = getNextMod(getNextMod(mod));
continue;
}
} else {
// exception handler for 4
if (num / mod == 4) {
Roman += getWeight(mod);
Roman += getWeight(mod * 5);
num %= mod;
mod = getNextMod(mod);
continue;
}
}
for (int i = 0; i < num / mod; i++) {
Roman += getWeight(mod);
}
num %= mod;
mod = getNextMod(mod);
}
return Roman;
}
bool modHalf(int mod) {
return mod == 5 || mod == 50 || mod == 500;
}
int getNextMod(int mod) {
switch(mod) {
case 1000:
return 500;
case 500:
return 100;
case 100:
return 50;
case 50:
return 10;
case 10:
return 5;
case 5:
return 1;
default:
return 0;
}
}
char getWeight(int mod) {
switch(mod) {
case 1000:
return 'M';
case 500:
return 'D';
case 100:
return 'C';
case 50:
return 'L';
case 10:
return 'X';
case 5:
return 'V';
case 1:
default:
return 'I';
}
}
};
時間複雜度:O(n)