题目链接
解法
一、哈希
不难发现,不同数位上的0~9
都与特定字符串有一一对应关系,所以我们使用哈希表,依次将整数的每一位转换成对应的字符串,即罗马数字。代码如下:
class Solution {
public:
string intToRoman(int num) {
map<int, string> s1 = { {0, ""},
{1, "I"}, {2, "II"}, {3, "III"},
{4, "IV"}, {5, "V"}, {6, "VI"},
{7, "VII"}, {8, "VIII"}, {9, "IX"}
};
map<int, string> s2 = { {0, ""},
{1, "X"}, {2, "XX"}, {3, "XXX"},
{4, "XL"}, {5, "L"}, {6, "LX"},
{7, "LXX"}, {8, "LXXX"}, {9, "XC"}
};
map<int, string> s3 = { {0, ""},
{1, "C"}, {2, "CC"}, {3, "CCC"},
{4, "CD"}, {5, "D"}, {6, "DC"},
{7, "DCC"}, {8, "DCCC"}, {9, "CM"}
};
map<int, string> s4 = { {0, ""},
{1, "M"}, {2, "MM"}, {3, "MMM"}
};
string ans = s4[num / 1000] + s3[(num % 1000) / 100] + s2[(num % 100) / 10] + s1[(num % 10)];
return ans;
}
};
还是哈希
我们发现,对于整数的每一位,用来表示它的罗马数字无非就是1, 5
加上特例4, 9
。以1994
为例,我们可以采用如下办法:
1994 > 1000
,罗马数字字符串加上对应1000
的M
,减去1000
994 > 900
,罗马数字字符串加上对应900
的CM
,减去900
94 > 90
,罗马数字字符串加上对应90
的XC
,减去90
- 最后剩余
4
,罗马数字字符串加上对应4
的IV
,减去4
,结束
代码如下:
class Solution {
public:
string intToRoman(int num) {
int values[] = {
1000,
900,500, 400, 100,
90, 50, 40, 10,
9, 5, 4, 1
};
string reps[] = {
"M",
"CM", "D", "CD", "C",
"XC", "L", "XL", "X",
"IX", "V", "IV", "I",
};
string ans;
for (int i = 0; i < 13; i ++) {
while (num >= values[i]) {
num -= values[i];
ans += reps[i];
}
}
return ans;
}
};